/*++

Copyright (c) 1991-1999,  Microsoft Corporation  All rights reserved.

Module Name:

    gcftest.c

Abstract:

    Test module for NLS API GetCurrencyFormat.

    NOTE: This code was simply hacked together quickly in order to
          test the different code modules of the NLS component.
          This is NOT meant to be a formal regression test.

Revision History:

    07-28-93    JulieB    Created.

--*/



//
//  Include Files.
//

#include "nlstest.h"




//
//  Constant Declarations.
//

#define  BUFSIZE             500            // buffer size in wide chars
#define  GCF_INVALID_FLAGS   ((DWORD)(~(LOCALE_NOUSEROVERRIDE)))

#define GCF_ENGLISH_US       L"$1,234,567.44"
#define GCF_CZECH            L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 K\x010d"




//
//  Global Variables.
//

LCID Locale;

LPWSTR pValue;
LPWSTR pNegValue;

CURRENCYFMT CurrFmt;

WCHAR lpCurrencyStr[BUFSIZE];


//
//  Currency format buffers must be in line with the pAllLocales global
//  buffer.
//
LPWSTR pPosCurrency[] =
{
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 \x043b\x0432",  //  0x0402
    L"NT$1,234,567.44",                                                    //  0x0404
    L"\xffe5\x0031,234,567.44",                                            //  0x0804
    L"HK$1,234,567.44",                                                    //  0x0c04
    L"$1,234,567.44",                                                      //  0x1004
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 K\x010d",       //  0x0405
    L"kr 1.234.567,44",                                                    //  0x0406
    L"1.234.567,44 \x20ac",                                                //  0x0407
    L"SFr. 1'234'567.44",                                                  //  0x0807
    L"\x20ac 1.234.567,44",                                                //  0x0c07
    L"1.234.567,44 \x20ac",                                                //  0x0408
    L"$1,234,567.44",                                                      //  0x0409
    L"�1,234,567.44",                                                      //  0x0809
    L"$1,234,567.44",                                                      //  0x0c09
    L"$1,234,567.44",                                                      //  0x1009
    L"$1,234,567.44",                                                      //  0x1409
    L"\x20ac\x0031,234,567.44",                                            //  0x1809
    L"1.234.567,44 \x20ac",                                                //  0x040a
    L"$1,234,567.44",                                                      //  0x080a
    L"1.234.567,44 \x20ac",                                                //  0x0c0a
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 \x20ac",        //  0x040b
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 \x20ac",        //  0x040c
    L"1.234.567,44 \x20ac",                                                //  0x080c
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 $",             //  0x0c0c
    L"SFr. 1'234'567.44",                                                  //  0x100c
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 Ft",            //  0x040e
    L"1.234.567,44 kr.",                                                   //  0x040f
    L"\x20ac 1.234.567,44",                                                //  0x0410
    L"SFr. 1'234'567.44",                                                  //  0x0810
    L"\x00a5\x0031,234,567",                                               //  0x0411
    L"\x20a9\x0031,234,567",                                               //  0x0412
    L"\x20ac 1.234.567,44",                                                //  0x0413
    L"1.234.567,44 \x20ac",                                                //  0x0813
    L"kr 1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44",            //  0x0414
    L"kr 1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44",            //  0x0814
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 z\x0142",       //  0x0415
    L"R$ 1.234.567,44",                                                    //  0x0416
    L"1.234.567,44 \x20ac",                                                //  0x0816
    L"1.234.567,44 lei",                                                   //  0x0418
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44\x0440.",        //  0x0419
    L"1.234.567,44 kn",                                                    //  0x041a
    L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 Sk",            //  0x041b
    L"1.234.567,44 kr",                                                    //  0x041d
    L"1.234.567,44 TL",                                                    //  0x041f
    L"1.234.567,44 SIT"                                                    //  0x0424
};

LPWSTR pNegCurrency[] =
{
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 \x043b\x0432", //  0x0402
    L"-NT$1,234,567.44",                                                   //  0x0404
    L"\xffe5-1,234,567.44",                                                //  0x0804
    L"(HK$1,234,567.44)",                                                  //  0x0c04
    L"($1,234,567.44)",                                                    //  0x1004
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 K\x010d",      //  0x0405
    L"kr -1.234.567,44",                                                   //  0x0406
    L"-1.234.567,44 \x20ac",                                               //  0x0407
    L"SFr.-1'234'567.44",                                                  //  0x0807
    L"-\x20ac 1.234.567,44",                                               //  0x0c07
    L"-1.234.567,44 \x20ac",                                               //  0x0408
    L"($1,234,567.44)",                                                    //  0x0409
    L"-�1,234,567.44",                                                     //  0x0809
    L"-$1,234,567.44",                                                     //  0x0c09
    L"-$1,234,567.44",                                                     //  0x1009
    L"-$1,234,567.44",                                                     //  0x1409
    L"-\x20ac\x0031,234,567.44",                                           //  0x1809
    L"-1.234.567,44 \x20ac",                                               //  0x040a
    L"-$1,234,567.44",                                                     //  0x080a
    L"-1.234.567,44 \x20ac",                                               //  0x0c0a
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 \x20ac",       //  0x040b
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 \x20ac",       //  0x040c
    L"-1.234.567,44 \x20ac",                                               //  0x080c
    L"(1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44$)",            //  0x0c0c
    L"SFr.-1'234'567.44",                                                  //  0x100c
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 Ft",           //  0x040e
    L"-1.234.567,44 kr.",                                                  //  0x040f
    L"-\x20ac 1.234.567,44",                                               //  0x0410
    L"SFr.-1'234'567.44",                                                  //  0x0810
    L"-\x00a5\x0031,234,567",                                              //  0x0411
    L"-\x20a9\x0031,234,567",                                              //  0x0412
    L"\x20ac 1.234.567,44-",                                               //  0x0413
    L"-1.234.567,44 \x20ac",                                               //  0x0813
    L"kr -1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44",           //  0x0414
    L"kr -1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44",           //  0x0814
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 z\x0142",      //  0x0415
    L"(R$ 1.234.567,44)",                                                  //  0x0416
    L"-1.234.567,44 \x20ac",                                               //  0x0816
    L"-1.234.567,44 lei",                                                  //  0x0418
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44\x0440.",       //  0x0419
    L"-1.234.567,44 kn",                                                   //  0x041a
    L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44 Sk",           //  0x041b
    L"-1.234.567,44 kr",                                                   //  0x041d
    L"-1.234.567,44 TL",                                                   //  0x041f
    L"-1.234.567,44 SIT"                                                   //  0x0424
};




//
//  Forward Declarations.
//

BOOL
InitGetCurrencyFormat();

int
GCF_BadParamCheck();

int
GCF_NormalCase();

int
GCF_Ansi();





////////////////////////////////////////////////////////////////////////////
//
//  TestGetCurrencyFormat
//
//  Test routine for GetCurrencyFormatW API.
//
//  07-28-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int TestGetCurrencyFormat()
{
    int ErrCount = 0;             // error count


    //
    //  Print out what's being done.
    //
    printf("\n\nTESTING GetCurrencyFormatW...\n\n");

    //
    //  Initialize global variables.
    //
    if (!InitGetCurrencyFormat())
    {
        printf("\nABORTED TestGetCurrencyFormat: Could not Initialize.\n");
        return (1);
    }

    //
    //  Test bad parameters.
    //
    ErrCount += GCF_BadParamCheck();

    //
    //  Test normal cases.
    //
    ErrCount += GCF_NormalCase();

    //
    //  Test Ansi version.
    //
    ErrCount += GCF_Ansi();

    //
    //  Print out result.
    //
    printf("\nGetCurrencyFormatW:  ERRORS = %d\n", ErrCount);

    //
    //  Return total number of errors found.
    //
    return (ErrCount);
}


////////////////////////////////////////////////////////////////////////////
//
//  InitGetCurrencyFormat
//
//  This routine initializes the global variables.  If no errors were
//  encountered, then it returns TRUE.  Otherwise, it returns FALSE.
//
//  07-28-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

BOOL InitGetCurrencyFormat()
{
    //
    //  Make a Locale.
    //
    Locale = MAKELCID(0x0409, 0);

    //
    //  Initialize the value.
    //
    pValue = L"1234567.4444";
    pNegValue = L"-1234567.4444";

    //
    //  Initialize the currency format structure.
    //
    CurrFmt.NumDigits = 3;
    CurrFmt.LeadingZero = 1;
    CurrFmt.Grouping = 3;
    CurrFmt.lpDecimalSep = L"/";
    CurrFmt.lpThousandSep = L";";
    CurrFmt.lpCurrencySymbol = L"*";
    CurrFmt.PositiveOrder = 3;
    CurrFmt.NegativeOrder = 6;

    //
    //  Return success.
    //
    return (TRUE);
}


////////////////////////////////////////////////////////////////////////////
//
//  GCF_BadParamCheck
//
//  This routine passes in bad parameters to the API routines and checks to
//  be sure they are handled properly.  The number of errors encountered
//  is returned to the caller.
//
//  07-28-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GCF_BadParamCheck()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    CURRENCYFMT MyCurrFmt;        // currency format


    //
    //  Bad Locale.
    //

    //  Variation 1  -  Bad Locale
    rc = GetCurrencyFormatW( (LCID)333,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "Bad Locale",
                         &NumErrors );


    //
    //  Null Pointers.
    //

    //  Variation 1  -  lpCurrencyStr = NULL
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             NULL,
                             NULL,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "lpCurrencyStr NULL",
                         &NumErrors );

    //  Variation 2  -  lpValue = NULL
    rc = GetCurrencyFormatW( Locale,
                             0,
                             NULL,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "lpValue NULL",
                         &NumErrors );


    //
    //  Bad Count.
    //

    //  Variation 1  -  cchCurrency < 0
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             -1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "cchCurrency < 0",
                         &NumErrors );


    //
    //  Invalid Flag.
    //

    //  Variation 1  -  dwFlags = invalid
    rc = GetCurrencyFormatW( Locale,
                             GCF_INVALID_FLAGS,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "Flag invalid",
                         &NumErrors );

    //  Variation 2  -  lpFormat and NoUserOverride
    rc = GetCurrencyFormatW( Locale,
                             LOCALE_NOUSEROVERRIDE,
                             pValue,
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "lpFormat and NoUserOverride",
                         &NumErrors );

    //  Variation 3  -  Use CP ACP, lpFormat and NoUserOverride
    rc = GetCurrencyFormatW( Locale,
                             LOCALE_USE_CP_ACP | LOCALE_NOUSEROVERRIDE,
                             pValue,
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "Use CP ACP, lpFormat and NoUserOverride",
                         &NumErrors );


    //
    //  Buffer Too Small.
    //

    //  Variation 1  -  cchCurrency = too small
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             2 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INSUFFICIENT_BUFFER,
                         "cchCurrency too small",
                         &NumErrors );


    //
    //  Bad format passed in.
    //

    //  Variation 1  -  bad NumDigits
    MyCurrFmt.NumDigits = 10;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad NumDigits",
                         &NumErrors );

    //  Variation 2  -  bad LeadingZero
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 2;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad LeadingZero",
                         &NumErrors );

    //  Variation 3  -  bad Grouping
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 10000;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad Grouping",
                         &NumErrors );

    //  Variation 4  -  bad DecimalSep
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = NULL;
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad DecimalSep",
                         &NumErrors );

    //  Variation 5  -  bad DecimalSep 2
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"////";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad DecimalSep2",
                         &NumErrors );

    //  Variation 6  -  bad DecimalSep 3
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"6";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad DecimalSep3",
                         &NumErrors );

    //  Variation 7  -  bad ThousandSep
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = NULL;
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad ThousandSep",
                         &NumErrors );

    //  Variation 8  -  bad ThousandSep 2
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";;;;";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad ThousandSep2",
                         &NumErrors );

    //  Variation 9  -  bad ThousandSep 3
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L"6";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad ThousandSep3",
                         &NumErrors );

    //  Variation 10  -  bad Currency Symbol
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = NULL;
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad Currency Symbol",
                         &NumErrors );

    //  Variation 11  -  bad Currency Symbol 2
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"******";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad Currency Symbol 2",
                         &NumErrors );

    //  Variation 12  -  bad Currency Symbol 3
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*6";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad Currency Symbol 3",
                         &NumErrors );

    //  Variation 13  -  bad Positive Order
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 4;
    MyCurrFmt.NegativeOrder = 6;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad Positive Order",
                         &NumErrors );


    //  Variation 14  -  bad Negative Order
    MyCurrFmt.NumDigits = 3;
    MyCurrFmt.LeadingZero = 1;
    MyCurrFmt.Grouping = 3;
    MyCurrFmt.lpDecimalSep = L"/";
    MyCurrFmt.lpThousandSep = L";";
    MyCurrFmt.lpCurrencySymbol = L"*";
    MyCurrFmt.PositiveOrder = 3;
    MyCurrFmt.NegativeOrder = 16;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             &MyCurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad Negative Order",
                         &NumErrors );


    //
    //  Return total number of errors found.
    //
    return (NumErrors);
}


////////////////////////////////////////////////////////////////////////////
//
//  GCF_NormalCase
//
//  This routine tests the normal cases of the API routine.
//
//  07-28-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GCF_NormalCase()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    int ctr;                      // loop counter


#ifdef PERF

  DbgBreakPoint();

#endif


    //
    //  Locales.
    //

    //  Variation 1  -  System Default Locale
    rc = GetCurrencyFormatW( LOCALE_SYSTEM_DEFAULT,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "System Default Locale",
                       &NumErrors );

    //  Variation 2  -  Current User Locale
    rc = GetCurrencyFormatW( LOCALE_USER_DEFAULT,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "Current User Locale",
                       &NumErrors );


    //
    //  Language Neutral.
    //

    //  Variation 1  -  neutral
    rc = GetCurrencyFormatW( 0x0000,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "neutral locale",
                       &NumErrors );

    //  Variation 2  -  sys default
    rc = GetCurrencyFormatW( 0x0400,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "sys default locale",
                       &NumErrors );

    //  Variation 3  -  user default
    rc = GetCurrencyFormatW( 0x0800,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "user default locale",
                       &NumErrors );

    //  Variation 4  -  sub lang neutral US
    rc = GetCurrencyFormatW( 0x0009,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "sub lang neutral US",
                       &NumErrors );

    //  Variation 5  -  sub lang neutral Czech
    rc = GetCurrencyFormatW( 0x0005,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_CZECH,
                       "sub lang neutral Czech",
                       &NumErrors );


    //
    //  Use CP ACP.
    //

    //  Variation 1  -  System Default Locale
    rc = GetCurrencyFormatW( LOCALE_SYSTEM_DEFAULT,
                             LOCALE_USE_CP_ACP,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "Use CP ACP, System Default Locale",
                       &NumErrors );


    //
    //  cchCurrency.
    //

    //  Variation 1  -  cchCurrency = size of lpCurrencyStr buffer
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "cchCurrency = bufsize",
                       &NumErrors );

    //  Variation 2  -  cchCurrency = 0
    lpCurrencyStr[0] = 0x0000;
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             0 );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       GCF_ENGLISH_US,
                       "cchCurrency zero",
                       &NumErrors );

    //  Variation 3  -  cchCurrency = 0, lpCurrencyStr = NULL
    rc = GetCurrencyFormatW( Locale,
                             0,
                             pValue,
                             NULL,
                             NULL,
                             0 );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       GCF_ENGLISH_US,
                       "cchCurrency (NULL ptr)",
                       &NumErrors );


    //
    //  lpFormat - pValue = 1234567.4444
    //
    //      CurrFmt.NumDigits = 3;
    //      CurrFmt.LeadingZero = 1;
    //      CurrFmt.Grouping = 3;
    //      CurrFmt.lpDecimalSep = L"/";
    //      CurrFmt.lpThousandSep = L";";
    //      CurrFmt.lpCurrencySymbol = L"*";
    //      CurrFmt.PositiveOrder = 3;
    //      CurrFmt.NegativeOrder = 6;
    //

    //  Variation 1  -  lpFormat
    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             pValue,
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"1;234;567/444 *",
                       "lpFormat (1;234;567/444 *)",
                       &NumErrors );

    //  Variation 2  -  lpFormat leading zero
    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L".4444",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"0/444 *",
                       "lpFormat (0/444 *)",
                       &NumErrors );

    //  Variation 3  -  lpFormat no decimal
    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"1234567",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"1;234;567/000 *",
                       "lpFormat (1;234;567/000 *)",
                       &NumErrors );

    //  Variation 4  -  lpFormat
    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-1234567.444",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"1;234;567/444-*",
                       "lpFormat (1;234;567/444-*)",
                       &NumErrors );

    //  Variation 5  -  lpFormat leading zero
    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-.4444",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"0/444-*",
                       "lpFormat (0/444-*)",
                       &NumErrors );

    //  Variation 6  -  lpFormat no decimal
    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-1234567",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"1;234;567/000-*",
                       "lpFormat (1;234;567/000-*)",
                       &NumErrors );


    //
    //  Flag values.
    //

    //  Variation 1  -  NOUSEROVERRIDE
    rc = GetCurrencyFormatW( Locale,
                             LOCALE_NOUSEROVERRIDE,
                             pValue,
                             NULL,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       GCF_ENGLISH_US,
                       "NoUserOverride",
                       &NumErrors );


    //
    //  Test all locales - pValue = 1234567.4444
    //
    for (ctr = 0; ctr < NumLocales; ctr++)
    {
        rc = GetCurrencyFormatW( pAllLocales[ctr],
                                 0,
                                 pValue,
                                 NULL,
                                 lpCurrencyStr,
                                 BUFSIZE );
        CheckReturnValidLoopW( rc,
                               -1,
                               lpCurrencyStr,
                               pPosCurrency[ctr],
                               "Pos",
                               pAllLocales[ctr],
                               &NumErrors );
    }



    //
    //  Test all locales - pNegValue = -1234567.4444
    //

    for (ctr = 0; ctr < NumLocales; ctr++)
    {
        rc = GetCurrencyFormatW( pAllLocales[ctr],
                                 0,
                                 pNegValue,
                                 NULL,
                                 lpCurrencyStr,
                                 BUFSIZE );
        CheckReturnValidLoopW( rc,
                               -1,
                               lpCurrencyStr,
                               pNegCurrency[ctr],
                               "Neg",
                               pAllLocales[ctr],
                               &NumErrors );
    }


    //
    //  Special case checks.
    //

    //  Variation 1  -  rounding check

    CurrFmt.NumDigits = 3;
    CurrFmt.LeadingZero = 1;
    CurrFmt.Grouping = 2;
    CurrFmt.lpDecimalSep = L".";
    CurrFmt.lpThousandSep = L",";
    CurrFmt.NegativeOrder = 1;
    CurrFmt.PositiveOrder = 0;
    CurrFmt.lpCurrencySymbol = L"$";

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"799.9999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$8,00.000",
                       "rounding ($8,00.000)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-799.9999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$8,00.000",
                       "rounding (-$8,00.000)",
                       &NumErrors );


    //  Variation 2  -  rounding check

    CurrFmt.NumDigits = 0 ;
    CurrFmt.LeadingZero = 1 ;
    CurrFmt.Grouping = 2 ;
    CurrFmt.lpDecimalSep = L"." ;
    CurrFmt.lpThousandSep = L"," ;
    CurrFmt.NegativeOrder = 1 ;
    CurrFmt.PositiveOrder = 0 ;
    CurrFmt.lpCurrencySymbol = L"$" ;

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"9.500",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$10",
                       "rounding ($10)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-9.500",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$10",
                       "rounding (-$10)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"99.500",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$1,00",
                       "rounding ($1,00)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-99.500",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$1,00",
                       "rounding (-$1,00)",
                       &NumErrors );


    //  Variation 3  -  grouping check

    CurrFmt.NumDigits = 3;
    CurrFmt.LeadingZero = 1;
    CurrFmt.Grouping = 32;
    CurrFmt.lpDecimalSep = L".";
    CurrFmt.lpThousandSep = L",";
    CurrFmt.NegativeOrder = 1;
    CurrFmt.PositiveOrder = 0;
    CurrFmt.lpCurrencySymbol = L"$";

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"1234567.999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$12,34,567.999",
                       "grouping ($12,34,567.999)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-1234567.999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$12,34,567.999",
                       "grouping (-$12,34,567.999)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"9999999.9999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$1,00,00,000.000",
                       "grouping/rounding ($1,00,00,000.000)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-9999999.9999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$1,00,00,000.000",
                       "grouping/rounding (-$1,00,00,000.000)",
                       &NumErrors );


    //  Variation 4  -  grouping check

    CurrFmt.NumDigits = 3;
    CurrFmt.LeadingZero = 1;
    CurrFmt.Grouping = 320;
    CurrFmt.lpDecimalSep = L".";
    CurrFmt.lpThousandSep = L",";
    CurrFmt.NegativeOrder = 1;
    CurrFmt.PositiveOrder = 0;
    CurrFmt.lpCurrencySymbol = L"$";

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"123456789.999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$1234,56,789.999",
                       "grouping ($1234,56,789.999)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-123456789.999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$1234,56,789.999",
                       "grouping (-$1234,56789.999)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"9999999.9999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$100,00,000.000",
                       "grouping/rounding ($100,00,000.000)",
                       &NumErrors );

    rc = GetCurrencyFormatW( 0x0409,
                             0,
                             L"-9999999.9999",
                             &CurrFmt,
                             lpCurrencyStr,
                             BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"-$100,00,000.000",
                       "grouping/rounding (-$100,00,000.000)",
                       &NumErrors );


    //  Variation 5  -  large number check

    SetLastError(0);
    rc = GetCurrencyFormat( LOCALE_USER_DEFAULT,
                            0,
                            L"10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
                            NULL,
                            lpCurrencyStr,
                            BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpCurrencyStr,
                       L"$10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00",
                       "big number",
                       &NumErrors );
    CheckLastError( 0,
                    "Last Error should be 0 - call should have succeeded",
                    &NumErrors );





    //
    //  Return total number of errors found.
    //
    return (NumErrors);
}

////////////////////////////////////////////////////////////////////////////
//
//  GCF_Ansi
//
//  This routine tests the Ansi version of the API routine.
//
//  07-28-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GCF_Ansi()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    BYTE pCurStrA[BUFSIZE];       // ptr to currency string buffer
    CURRENCYFMTA CurrFmtA;        // currency format structure


    //
    //  GetCurrencyFormatA.
    //

    //  Variation 1  -  cchCurrency = size of lpCurrencyStr buffer
    rc = GetCurrencyFormatA( Locale,
                             0,
                             "123456.789",
                             NULL,
                             pCurStrA,
                             BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       pCurStrA,
                       "$123,456.79",
                       NULL,
                       "A version cchCurrency = bufsize",
                       &NumErrors );

    //  Variation 2  -  cchCurrency = 0
    pCurStrA[0] = 0x00;
    rc = GetCurrencyFormatA( Locale,
                             0,
                             "123456.789",
                             NULL,
                             pCurStrA,
                             0 );
    CheckReturnValidA( rc,
                       -1,
                       NULL,
                       "$123,456.79",
                       NULL,
                       "A version cchCurrency = bufsize, no Dest",
                       &NumErrors );

    //  Variation 3  -  cchCurrency = 0, lpCurrencyStr = NULL
    rc = GetCurrencyFormatA(Locale, 0, "123456.789", NULL, NULL, 0);
    CheckReturnValidA( rc,
                       -1,
                       NULL,
                       "$123,456.79",
                       NULL,
                       "A version cchCurrency (NULL ptr)",
                       &NumErrors );

    //
    //  Use CP ACP.
    //

    //  Variation 1  -  Use CP ACP, cchCurrency = bufsize
    rc = GetCurrencyFormatA( Locale,
                             LOCALE_USE_CP_ACP,
                             "123456.789",
                             NULL,
                             pCurStrA,
                             BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       pCurStrA,
                       "$123,456.79",
                       NULL,
                       "A version Use CP ACP, cchCurrency = bufsize",
                       &NumErrors );


    //
    //  lpFormat - pValue = 1234567.4444
    //

    CurrFmtA.NumDigits = 3;
    CurrFmtA.LeadingZero = 1;
    CurrFmtA.Grouping = 3;
    CurrFmtA.lpDecimalSep = "/";
    CurrFmtA.lpThousandSep = ";";
    CurrFmtA.lpCurrencySymbol = "*";
    CurrFmtA.PositiveOrder = 3;
    CurrFmtA.NegativeOrder = 6;


    //  Variation 1  -  lpFormat
    rc = GetCurrencyFormatA( 0x0409,
                             0,
                             "1234567.4444",
                             &CurrFmtA,
                             pCurStrA,
                             BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       pCurStrA,
                       "1;234;567/444 *",
                       NULL,
                       "A version cchCurrency (NULL ptr)",
                       &NumErrors );


    //
    //  Return total number of errors found.
    //
    return (NumErrors);
}