/*++

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

Module Name:

    glitest.c

Abstract:

    Test module for NLS API GetLocaleInfo.

    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:

    06-14-91    JulieB    Created.

--*/



//
//  Include Files.
//

#include "nlstest.h"




//
//  Constant Declarations.
//

#define  BUFSIZE         50                 // buffer size in wide chars
#define  LCTYPE_INVALID  0x0000100          // invalid LCTYPE
#define  LANG_INVALID    0x0417             // invalid lang id


#define  S_ILANGUAGE            L"0409"
#define  S_SLANGUAGE            L"English (United States)"

#define  S_SMONTHNAME1_RUSSIAN  L"\x042f\x043d\x0432\x0430\x0440\x044c"
#define  S_SMONTHNAME2_RUSSIAN  L"\x0424\x0435\x0432\x0440\x0430\x043b\x044c"

#define  FONTSIG_ENGLISH        L"\x00af\x8000\x38cb\x0000\x0000\x0000\x0000\x0000\x0001\x0000\x0000\x8000\x01ff\x003f\x8000\xffff"
#define  FONTSIG_RUSSIAN        L"\x0203\x8000\x3848\x0000\x0000\x0000\x0000\x0000\x0004\x0000\x0000\x0002\x0004\x0000\x0000\x0202"

#define  FONTSIG_ENGLISH_A      "\xaf\x00\x00\x80\xcb\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x80\xff\x01\x3f\x00\x00\x80\xff\xff"
#define  FONTSIG_RUSSIAN_A      "\x03\x02\x00\x80\x48\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x02\x00\x04\x00\x00\x00\x00\x00\x02\x02"




//
//  Global Variables.
//

LCID Locale;

WCHAR lpLCData[BUFSIZE];
BYTE  lpLCDataA[BUFSIZE];

//
//  pLocaleFlag and pLocaleString must have the same number of entries.
//
LCTYPE pLocaleFlag[] =
{
    LOCALE_ILANGUAGE,
    LOCALE_SLANGUAGE,
    LOCALE_SENGLANGUAGE,
    LOCALE_SABBREVLANGNAME,
    LOCALE_SNATIVELANGNAME,

    LOCALE_ICOUNTRY,
    LOCALE_SCOUNTRY,
    LOCALE_SENGCOUNTRY,
    LOCALE_SABBREVCTRYNAME,
    LOCALE_SNATIVECTRYNAME,
    LOCALE_IGEOID,

    LOCALE_SSORTNAME,

    LOCALE_IDEFAULTLANGUAGE,
    LOCALE_IDEFAULTCOUNTRY,
    LOCALE_IDEFAULTANSICODEPAGE,
    LOCALE_IDEFAULTCODEPAGE,
    LOCALE_IDEFAULTMACCODEPAGE,
    LOCALE_IDEFAULTEBCDICCODEPAGE,

    LOCALE_SLIST,
    LOCALE_IMEASURE,
    LOCALE_IPAPERSIZE,

    LOCALE_SDECIMAL,
    LOCALE_STHOUSAND,
    LOCALE_SGROUPING,
    LOCALE_IDIGITS,
    LOCALE_ILZERO,
    LOCALE_SNATIVEDIGITS,

    LOCALE_SCURRENCY,
    LOCALE_SINTLSYMBOL,
    LOCALE_SENGCURRNAME,
    LOCALE_SNATIVECURRNAME,
    LOCALE_SMONDECIMALSEP,
    LOCALE_SMONTHOUSANDSEP,
    LOCALE_SMONGROUPING,
    LOCALE_ICURRDIGITS,
    LOCALE_IINTLCURRDIGITS,
    LOCALE_ICURRENCY,
    LOCALE_INEGCURR,
    LOCALE_SPOSITIVESIGN,
    LOCALE_SNEGATIVESIGN,

    LOCALE_IPOSSIGNPOSN,
    LOCALE_INEGSIGNPOSN,
    LOCALE_IPOSSYMPRECEDES,
    LOCALE_IPOSSEPBYSPACE,
    LOCALE_INEGSYMPRECEDES,
    LOCALE_INEGSEPBYSPACE,

    LOCALE_STIMEFORMAT,
    LOCALE_STIME,
    LOCALE_ITIME,
    LOCALE_ITLZERO,
    LOCALE_ITIMEMARKPOSN,
    LOCALE_S1159,
    LOCALE_S2359,

    LOCALE_SSHORTDATE,
    LOCALE_SDATE,
    LOCALE_IDATE,
    LOCALE_ICENTURY,
    LOCALE_IDAYLZERO,
    LOCALE_IMONLZERO,

    LOCALE_SYEARMONTH,
    LOCALE_SLONGDATE,
    LOCALE_ILDATE,

    LOCALE_ICALENDARTYPE,
    LOCALE_IOPTIONALCALENDAR,

    LOCALE_IFIRSTDAYOFWEEK,
    LOCALE_IFIRSTWEEKOFYEAR,

    LOCALE_SDAYNAME1,
    LOCALE_SDAYNAME2,
    LOCALE_SDAYNAME3,
    LOCALE_SDAYNAME4,
    LOCALE_SDAYNAME5,
    LOCALE_SDAYNAME6,
    LOCALE_SDAYNAME7,

    LOCALE_SABBREVDAYNAME1,
    LOCALE_SABBREVDAYNAME2,
    LOCALE_SABBREVDAYNAME3,
    LOCALE_SABBREVDAYNAME4,
    LOCALE_SABBREVDAYNAME5,
    LOCALE_SABBREVDAYNAME6,
    LOCALE_SABBREVDAYNAME7,

    LOCALE_SMONTHNAME1,
    LOCALE_SMONTHNAME2,
    LOCALE_SMONTHNAME3,
    LOCALE_SMONTHNAME4,
    LOCALE_SMONTHNAME5,
    LOCALE_SMONTHNAME6,
    LOCALE_SMONTHNAME7,
    LOCALE_SMONTHNAME8,
    LOCALE_SMONTHNAME9,
    LOCALE_SMONTHNAME10,
    LOCALE_SMONTHNAME11,
    LOCALE_SMONTHNAME12,
    LOCALE_SMONTHNAME13,

    LOCALE_SABBREVMONTHNAME1,
    LOCALE_SABBREVMONTHNAME2,
    LOCALE_SABBREVMONTHNAME3,
    LOCALE_SABBREVMONTHNAME4,
    LOCALE_SABBREVMONTHNAME5,
    LOCALE_SABBREVMONTHNAME6,
    LOCALE_SABBREVMONTHNAME7,
    LOCALE_SABBREVMONTHNAME8,
    LOCALE_SABBREVMONTHNAME9,
    LOCALE_SABBREVMONTHNAME10,
    LOCALE_SABBREVMONTHNAME11,
    LOCALE_SABBREVMONTHNAME12,
    LOCALE_SABBREVMONTHNAME13
};

#define NUM_LOCALE_FLAGS     ( sizeof(pLocaleFlag) / sizeof(LCTYPE) )

LPWSTR pLocaleString[] =
{
    L"0409",
    L"English (United States)",
    L"English",
    L"ENU",
    L"English",

    L"1",
    L"United States",
    L"United States",
    L"USA",
    L"United States",
    L"244",

    L"Default",

    L"0409",
    L"1",
    L"1252",
    L"437",
    L"10000",
    L"037",

    L",",
    L"1",
    L"1",

    L".",
    L",",
    L"3;0",
    L"2",
    L"1",
    L"0123456789",

    L"$",
    L"USD",
    L"US Dollar",
    L"US Dollar",
    L".",
    L",",
    L"3;0",
    L"2",
    L"2",
    L"0",
    L"0",
    L"",
    L"-",

    L"3",
    L"0",
    L"1",
    L"0",
    L"1",
    L"0",

    L"h:mm:ss tt",
    L":",
    L"0",
    L"0",
    L"0",
    L"AM",
    L"PM",

    L"M/d/yyyy",
    L"/",
    L"0",
    L"1",
    L"0",
    L"0",

    L"MMMM, yyyy",
    L"dddd, MMMM dd, yyyy",
    L"0",

    L"1",
    L"0",

    L"6",
    L"0",

    L"Monday",
    L"Tuesday",
    L"Wednesday",
    L"Thursday",
    L"Friday",
    L"Saturday",
    L"Sunday",

    L"Mon",
    L"Tue",
    L"Wed",
    L"Thu",
    L"Fri",
    L"Sat",
    L"Sun",

    L"January",
    L"February",
    L"March",
    L"April",
    L"May",
    L"June",
    L"July",
    L"August",
    L"September",
    L"October",
    L"November",
    L"December",
    L"",

    L"Jan",
    L"Feb",
    L"Mar",
    L"Apr",
    L"May",
    L"Jun",
    L"Jul",
    L"Aug",
    L"Sep",
    L"Oct",
    L"Nov",
    L"Dec",
    L""
};


//
//  pLocaleIntFlag and pLocaleInt must have the same number of entries.
//
LCTYPE pLocaleIntFlag[] =
{
    LOCALE_ILANGUAGE,
    LOCALE_ICOUNTRY,

    LOCALE_IDEFAULTLANGUAGE,
    LOCALE_IDEFAULTCOUNTRY,
    LOCALE_IDEFAULTANSICODEPAGE,
    LOCALE_IDEFAULTCODEPAGE,
    LOCALE_IDEFAULTMACCODEPAGE,
    LOCALE_IGEOID,

    LOCALE_IMEASURE,

    LOCALE_IDIGITS,
    LOCALE_ILZERO,

    LOCALE_ICURRDIGITS,
    LOCALE_IINTLCURRDIGITS,
    LOCALE_ICURRENCY,
    LOCALE_INEGCURR,

    LOCALE_IPOSSIGNPOSN,
    LOCALE_INEGSIGNPOSN,
    LOCALE_IPOSSYMPRECEDES,
    LOCALE_IPOSSEPBYSPACE,
    LOCALE_INEGSYMPRECEDES,
    LOCALE_INEGSEPBYSPACE,

    LOCALE_ITIME,
    LOCALE_ITLZERO,
    LOCALE_ITIMEMARKPOSN,

    LOCALE_IDATE,
    LOCALE_ICENTURY,
    LOCALE_IDAYLZERO,
    LOCALE_IMONLZERO,
    LOCALE_ILDATE,

    LOCALE_ICALENDARTYPE,
    LOCALE_IOPTIONALCALENDAR,

    LOCALE_IFIRSTDAYOFWEEK,
    LOCALE_IFIRSTWEEKOFYEAR
};

#define NUM_LOCALE_INT_FLAGS ( sizeof(pLocaleIntFlag) / sizeof(LCTYPE) )

DWORD pLocaleInt[] =
{
    0x0409,
    1,

    0x0409,
    1,
    1252,
    437,
    10000,
    244,

    1,

    2,
    1,

    2,
    2,
    0,
    0,

    3,
    0,
    1,
    0,
    1,
    0,

    0,
    0,
    0,

    0,
    1,
    0,
    0,
    0,

    1,
    0,

    6,
    0
};




//
//  Forward Declarations.
//

BOOL
InitGetLocInfo();

int
GLI_BadParamCheck();

int
GLI_NormalCase();

int
GLI_Ansi();

int
VER_NormalCase();





////////////////////////////////////////////////////////////////////////////
//
//  TestGetLocaleInfo
//
//  Test routine for GetLocaleInfoW API.
//
//  06-14-91    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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

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

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

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

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

    //
    //  Test Version Routines.
    //
    ErrCount += VER_NormalCase();

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

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


////////////////////////////////////////////////////////////////////////////
//
//  InitGetLocInfo
//
//  This routine initializes the global variables.  If no errors were
//  encountered, then it returns TRUE.  Otherwise, it returns FALSE.
//
//  06-14-91    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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


////////////////////////////////////////////////////////////////////////////
//
//  GLI_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.
//
//  06-14-91    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GLI_BadParamCheck()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code


    //
    //  Bad Locale.
    //

    //  Variation 1  -  Bad Locale
    rc = GetLocaleInfoW( (LCID)333,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "Bad Locale",
                         &NumErrors );


    //
    //  Null Pointers.
    //

    //  Variation 1  -  lpLCData = NULL
    rc = GetLocaleInfoW( Locale,
                         LOCALE_ILANGUAGE,
                         NULL,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "lpLCData NULL",
                         &NumErrors );


    //
    //  Bad Counts.
    //

    //  Variation 1  -  cbBuf < 0
    rc = GetLocaleInfoW( Locale,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         -1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "cbBuf < 0",
                         &NumErrors );


    //
    //  Zero or Invalid Type.
    //

    //  Variation 1  -  LCType = invalid
    rc = GetLocaleInfoW( Locale,
                         LCTYPE_INVALID,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "LCType invalid",
                         &NumErrors );

    //  Variation 2  -  LCType = 0
    rc = GetLocaleInfoW( Locale,
                         0,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "LCType zero",
                         &NumErrors );

    //  Variation 3  -  Use CP ACP, LCType = invalid
    rc = GetLocaleInfoW( Locale,
                         LOCALE_USE_CP_ACP | LCTYPE_INVALID,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "Use CP ACP, LCType invalid",
                         &NumErrors );



    //
    //  Buffer Too Small.
    //

    //  Variation 1  -  cbBuf = too small
    rc = GetLocaleInfoW( Locale,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         2 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INSUFFICIENT_BUFFER,
                         "cbBuf too small",
                         &NumErrors );


    //
    //  Bad locale - Not valid in RC file.
    //
    //  Variation 1  -  SLANGUAGE - invalid
    rc = GetLocaleInfoW( LANG_INVALID,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "invalid locale - invalid",
                         &NumErrors );


    //
    //  RETURN_NUMBER flag.
    //
    //  Variation 1  -  invalid flags
    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_SLANGUAGE | LOCALE_RETURN_NUMBER,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "invalid flags - RETURN_NUMBER",
                         &NumErrors );

    //  Variation 2  -  insufficent buffer
    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER,
                         lpLCData,
                         1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INSUFFICIENT_BUFFER,
                         "insufficient buffer 1 - RETURN_NUMBER",
                         &NumErrors );

    //  Variation 3  -  insufficent buffer
    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         lpLCData,
                         1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INSUFFICIENT_BUFFER,
                         "insufficient buffer 2 - RETURN_NUMBER",
                         &NumErrors );


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


////////////////////////////////////////////////////////////////////////////
//
//  GLI_NormalCase
//
//  This routine tests the normal cases of the API routine.
//
//  06-14-91    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GLI_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 = GetLocaleInfoW( LOCALE_SYSTEM_DEFAULT,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnEqual( rc,
                      0,
                      "system default locale",
                      &NumErrors );

    //  Variation 2  -  Current User Locale
    rc = GetLocaleInfoW( LOCALE_USER_DEFAULT,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnEqual( rc,
                      0,
                      "current user locale",
                      &NumErrors );


    //
    //  Use CP ACP.
    //

    //  Variation 1  -  Use CP ACP, System Default Locale
    rc = GetLocaleInfoW( LOCALE_SYSTEM_DEFAULT,
                         LOCALE_USE_CP_ACP | LOCALE_ILANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnEqual( rc,
                      0,
                      "Use CP ACP, system default locale",
                      &NumErrors );


    //
    //  cbBuf.
    //

    //  Variation 1  -  cbBuf = size of lpLCData buffer
    rc = GetLocaleInfoW( Locale,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_ILANGUAGE,
                       "cbBuf = bufsize",
                       &NumErrors );

    //  Variation 2  -  cbBuf = 0
    lpLCData[0] = 0x0000;
    rc = GetLocaleInfoW( Locale,
                         LOCALE_ILANGUAGE,
                         lpLCData,
                         0 );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       S_ILANGUAGE,
                       "cbBuf zero",
                       &NumErrors );

    //  Variation 3  -  cbBuf = 0, lpLCData = NULL
    rc = GetLocaleInfoW( Locale,
                         LOCALE_ILANGUAGE,
                         NULL,
                         0 );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       S_ILANGUAGE,
                       "cbBuf (NULL ptr)",
                       &NumErrors );


    //
    //  LCTYPE values.
    //

    for (ctr = 0; ctr < NUM_LOCALE_FLAGS; ctr++)
    {
        rc = GetLocaleInfoW( Locale,
                             pLocaleFlag[ctr],
                             lpLCData,
                             BUFSIZE );
        CheckReturnValidLoopW( rc,
                               -1,
                               lpLCData,
                               pLocaleString[ctr],
                               "Locale Flag",
                               pLocaleFlag[ctr],
                               &NumErrors );
    }


    //
    //  RC file - SLANGUAGE and SCOUNTRY.
    //

    //  Variation 1  -  SLANGUAGE - Czech
    rc = GetLocaleInfoW( 0x0405,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Czech",
                       "SLANGUAGE (Czech)",
                       &NumErrors );

    //  Variation 2  -  SCOUNTRY - Czech
    rc = GetLocaleInfoW( 0x0405,
                         LOCALE_SCOUNTRY,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Czech Republic",
                       "SCOUNTRY (Czech)",
                       &NumErrors );

    //  Variation 3  -  SCOUNTRY - Slovak
    rc = GetLocaleInfoW( 0x041B,
                         LOCALE_SCOUNTRY,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Slovakia",
                       "SCOUNTRY (Slovak)",
                       &NumErrors );

    //  Variation 4  -  SENGCOUNTRY - Czech
    rc = GetLocaleInfoW( 0x0405,
                         LOCALE_SENGCOUNTRY,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Czech Republic",
                       "SENGCOUNTRY (Czech)",
                       &NumErrors );

    //  Variation 5  -  SENGCOUNTRY - Slovak
    rc = GetLocaleInfoW( 0x041B,
                         LOCALE_SENGCOUNTRY,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Slovakia",
                       "SENGCOUNTRY (Slovak)",
                       &NumErrors );


    //
    //  Language Neutral.
    //

    //  Variation 1  -  SLANGUAGE - neutral
    rc = GetLocaleInfoW( 0x0000,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_SLANGUAGE,
                       "SLANGUAGE (neutral)",
                       &NumErrors );

    //  Variation 2  -  SLANGUAGE - sys default
    rc = GetLocaleInfoW( 0x0400,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_SLANGUAGE,
                       "SLANGUAGE (sys default)",
                       &NumErrors );

    //  Variation 3  -  SLANGUAGE - user default
    rc = GetLocaleInfoW( 0x0800,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_SLANGUAGE,
                       "SLANGUAGE (user default)",
                       &NumErrors );

    //  Variation 4  -  SLANGUAGE - sub lang neutral US
    rc = GetLocaleInfoW( 0x0009,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_SLANGUAGE,
                       "SLANGUAGE (sub lang neutral US)",
                       &NumErrors );

    //  Variation 5  -  SLANGUAGE - sub lang neutral Czech
    rc = GetLocaleInfoW( 0x0005,
                         LOCALE_SLANGUAGE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Czech",
                       "SLANGUAGE (sub lang neutral Czech)",
                       &NumErrors );



    //
    //  Test Russian Month Names.
    //
    //  Variation 1  -  SMONTHNAME1
    rc = GetLocaleInfoW( 0x0419,
                         LOCALE_SMONTHNAME1,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_SMONTHNAME1_RUSSIAN,
                       "Russian SMONTHNAME1",
                       &NumErrors );

    //  Variation 2  -  SMONTHNAME2
    rc = GetLocaleInfoW( 0x0419,
                         LOCALE_SMONTHNAME2,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       S_SMONTHNAME2_RUSSIAN,
                       "Russian SMONTHNAME2",
                       &NumErrors );



    //
    //  Test Font Signature.
    //
    //  Variation 1  -  FONTSIGNATURE
    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_FONTSIGNATURE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       16,
                       lpLCData,
                       FONTSIG_ENGLISH,
                       "English FONTSIGNATURE",
                       &NumErrors );

    //  Variation 2  -  FONTSIGNATURE
    rc = GetLocaleInfoW( 0x0419,
                         LOCALE_FONTSIGNATURE,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       16,
                       lpLCData,
                       FONTSIG_RUSSIAN,
                       "Russian FONTSIGNATURE",
                       &NumErrors );



    //
    //  Test Return Number flag.
    //
    //  Variation 1  -  RETURN_NUMBER
    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidInt( rc,
                         2,
                         *((LPDWORD)lpLCData),
                         1252,
                         "Return_Number - ansi codepage for 0x0409",
                         &NumErrors );

    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         NULL,
                         0 );
    CheckReturnValidInt( rc,
                         2,
                         1252,
                         1252,
                         "Return_Number - ansi codepage for 0x0409 (no cchData)",
                         &NumErrors );

    //  Variation 2  -  RETURN_NUMBER
    rc = GetLocaleInfoW( 0x041f,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidInt( rc,
                         2,
                         *((LPDWORD)lpLCData),
                         1254,
                         "Return_Number - ansi codepage for 0x041f",
                         &NumErrors );

    rc = GetLocaleInfoW( 0x041f,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         NULL,
                         0 );
    CheckReturnValidInt( rc,
                         2,
                         1254,
                         1254,
                         "Return_Number - ansi codepage for 0x041f (no cchData)",
                         &NumErrors );

    //  Variation 3  -  RETURN_NUMBER
    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidInt( rc,
                         2,
                         *((LPDWORD)lpLCData),
                         0x0409,
                         "Return_Number - iLanguage",
                         &NumErrors );

    rc = GetLocaleInfoW( 0x0409,
                         LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER,
                         NULL,
                         0 );
    CheckReturnValidInt( rc,
                         2,
                         0x0409,
                         0x0409,
                         "Return_Number - iLanguage (no cchData)",
                         &NumErrors );


    //
    //   Try all INT flags with LOCALE_RETURN_NUMBER flag.
    //
    for (ctr = 0; ctr < NUM_LOCALE_INT_FLAGS; ctr++)
    {
        rc = GetLocaleInfoW( 0x0409,
                             pLocaleIntFlag[ctr] | LOCALE_RETURN_NUMBER,
                             lpLCData,
                             BUFSIZE );
        CheckReturnValidInt( rc,
                             2,
                             *((LPDWORD)lpLCData),
                             pLocaleInt[ctr],
                             "Locale Int Flag",
                             &NumErrors );
    }



    //
    //  Test SSORTNAME.
    //
    //  Variation 1  -  SSORTNAME
    rc = GetLocaleInfoW( 0x00000407,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Dictionary",
                       "SSORTNAME 0x00000407",
                       &NumErrors );

    //  Variation 2  -  SSORTNAME
    rc = GetLocaleInfoW( 0x00010407,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Phone Book (DIN)",
                       "SSORTNAME 0x00010407",
                       &NumErrors );

    //  Variation 3  -  SSORTNAME
    rc = GetLocaleInfoW( 0x0000040a,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Traditional",
                       "SSORTNAME 0x0000040a",
                       &NumErrors );

    //  Variation 4  -  SSORTNAME
    rc = GetLocaleInfoW( 0x00000c0a,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"International",
                       "SSORTNAME 0x00000c0a",
                       &NumErrors );

    //  Variation 5  -  SSORTNAME
    rc = GetLocaleInfoW( 0x00000404,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Stroke Count",
                       "SSORTNAME 0x00000404",
                       &NumErrors );

    //  Variation 7  -  SSORTNAME
    rc = GetLocaleInfoW( 0x00020404,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "SSORTNAME 0x00020404",
                         &NumErrors );

    //  Variation 8  -  SSORTNAME
    rc = GetLocaleInfoW( 0x00000804,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Pronunciation",
                       "SSORTNAME 0x00000804",
                       &NumErrors );

    //  Variation 10 -  SSORTNAME
    rc = GetLocaleInfoW( 0x00020804,
                         LOCALE_SSORTNAME,
                         lpLCData,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpLCData,
                       L"Stroke Count",
                       "SSORTNAME 0x00020804",
                       &NumErrors );



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


////////////////////////////////////////////////////////////////////////////
//
//  GLI_Ansi
//
//  This routine tests the Ansi version of the API routine.
//
//  06-14-91    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


    //
    //  GetLocaleInfoA.
    //

    //  Variation 1  -  ILANGUAGE
    rc = GetLocaleInfoA( Locale,
                         LOCALE_ILANGUAGE,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "0409",
                       NULL,
                       "A version ILANGUAGE",
                       &NumErrors );

    //  Variation 2  -  ILANGUAGE
    rc = GetLocaleInfoA( Locale,
                         LOCALE_ILANGUAGE,
                         NULL,
                         0 );
    CheckReturnValidA( rc,
                       -1,
                       NULL,
                       "0409",
                       NULL,
                       "A version ILANGUAGE, no Dest",
                       &NumErrors );

    //  Variation 3  -  ILANGUAGE
    rc = GetLocaleInfoA( Locale,
                         LOCALE_ILANGUAGE,
                         NULL,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "A version bad lpLCData",
                         &NumErrors );

    //  Variation 4  -  SSHORTDATE
    rc = GetLocaleInfoA( Locale,
                         LOCALE_SSHORTDATE,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "M/d/yyyy",
                       NULL,
                       "A version SSHORTDATE",
                       &NumErrors );

    //  Variation 5  -  SSHORTDATE
    rc = GetLocaleInfoA( Locale,
                         LOCALE_SSHORTDATE,
                         NULL,
                         0 );
    CheckReturnValidA( rc,
                       -1,
                       NULL,
                       "M/d/yyyy",
                       NULL,
                       "A version SSHORTDATE, no Dest",
                       &NumErrors );




    //
    //  Use CP ACP.
    //

    //  Variation 1  -  Use CP ACP, ILANGUAGE
    rc = GetLocaleInfoA( Locale,
                         LOCALE_USE_CP_ACP | LOCALE_ILANGUAGE,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "0409",
                       NULL,
                       "A version Use CP ACP, ILANGUAGE",
                       &NumErrors );


    //
    //  Make sure the A and W versions set the same error value.
    //

    SetLastError( 0 );
    rc = GetLocaleInfoA( Locale,
                         LOCALE_SLIST,
                         lpLCDataA,
                         -1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "A and W error returns same - A version",
                         &NumErrors );

    SetLastError( 0 );
    rc = GetLocaleInfoW( Locale,
                         LOCALE_SLIST,
                         lpLCData,
                         -1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "A and W error returns same - W version",
                         &NumErrors );


    //
    //  Test Font Signature.
    //
    //  Variation 1  -  FONTSIGNATURE
    rc = GetLocaleInfoA( 0x0409,
                         LOCALE_FONTSIGNATURE,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       32,
                       lpLCDataA,
                       FONTSIG_ENGLISH_A,
                       NULL,
                       "A Version English FONTSIGNATURE",
                       &NumErrors );

    //  Variation 2  -  FONTSIGNATURE
    rc = GetLocaleInfoA( 0x0419,
                         LOCALE_FONTSIGNATURE,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       32,
                       lpLCDataA,
                       FONTSIG_RUSSIAN_A,
                       NULL,
                       "A Version Russian FONTSIGNATURE",
                       &NumErrors );


    //
    //  Test Return Number flag.
    //
    //  Variation 1  -  RETURN_NUMBER
    rc = GetLocaleInfoA( 0x0409,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidInt( rc,
                         4,
                         *((LPDWORD)lpLCDataA),
                         1252,
                         "A Version Return_Number - ansi codepage for 0x0409",
                         &NumErrors );

    rc = GetLocaleInfoA( 0x0409,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         NULL,
                         0 );
    CheckReturnValidInt( rc,
                         4,
                         1252,
                         1252,
                         "A Version Return_Number - ansi codepage for 0x0409 (no cchData)",
                         &NumErrors );

    //  Variation 2  -  RETURN_NUMBER
    rc = GetLocaleInfoA( 0x041f,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidInt( rc,
                         4,
                         *((LPDWORD)lpLCDataA),
                         1254,
                         "A Version Return_Number - ansi codepage for 0x041f",
                         &NumErrors );

    rc = GetLocaleInfoA( 0x041f,
                         LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                         NULL,
                         0 );
    CheckReturnValidInt( rc,
                         4,
                         1254,
                         1254,
                         "A Version Return_Number - ansi codepage for 0x041f (no cchData)",
                         &NumErrors );

    //  Variation 3  -  RETURN_NUMBER
    rc = GetLocaleInfoA( 0x0409,
                         LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidInt( rc,
                         4,
                         *((LPDWORD)lpLCDataA),
                         0x0409,
                         "A Version Return_Number - iLanguage",
                         &NumErrors );

    rc = GetLocaleInfoA( 0x0409,
                         LOCALE_ILANGUAGE | LOCALE_RETURN_NUMBER,
                         NULL,
                         0 );
    CheckReturnValidInt( rc,
                         4,
                         0x0409,
                         0x0409,
                         "A Version Return_Number - iLanguage (no cchData)",
                         &NumErrors );



    //
    //   Try all INT flags with LOCALE_RETURN_NUMBER flag.
    //
    for (ctr = 0; ctr < NUM_LOCALE_INT_FLAGS; ctr++)
    {
        rc = GetLocaleInfoA( 0x0409,
                             pLocaleIntFlag[ctr] | LOCALE_RETURN_NUMBER,
                             lpLCDataA,
                             BUFSIZE );
        CheckReturnValidInt( rc,
                             4,
                             *((LPDWORD)lpLCDataA),
                             pLocaleInt[ctr],
                             "A Version Locale Int Flag",
                             &NumErrors );
    }



    //
    //  Test SSORTNAME.
    //
    //  Variation 1  -  SSORTNAME
    rc = GetLocaleInfoA( 0x00000407,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "Dictionary",
                       NULL,
                       "A version SSORTNAME 0x00000407",
                       &NumErrors );

    //  Variation 2  -  SSORTNAME
    rc = GetLocaleInfoA( 0x00010407,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "Phone Book (DIN)",
                       NULL,
                       "A version SSORTNAME 0x00010407",
                       &NumErrors );

    //  Variation 3  -  SSORTNAME
    rc = GetLocaleInfoA( 0x0000040a,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "Traditional",
                       NULL,
                       "A version SSORTNAME 0x0000040a",
                       &NumErrors );

    //  Variation 4  -  SSORTNAME
    rc = GetLocaleInfoA( 0x00000c0a,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "International",
                       NULL,
                       "A version SSORTNAME 0x00000c0a",
                       &NumErrors );

    //  Variation 5  -  SSORTNAME
    rc = GetLocaleInfoA( 0x00000404,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "Stroke Count",
                       NULL,
                       "A version SSORTNAME 0x00000404",
                       &NumErrors );

    //  Variation 7  -  SSORTNAME
    rc = GetLocaleInfoA( 0x00020404,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "A version SSORTNAME 0x00020404",
                         &NumErrors );

    //  Variation 8  -  SSORTNAME
    rc = GetLocaleInfoA( 0x00000804,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "Pronunciation",
                       NULL,
                       "A version SSORTNAME 0x00000804",
                       &NumErrors );

    //  Variation 10 -  SSORTNAME
    rc = GetLocaleInfoA( 0x00020804,
                         LOCALE_SSORTNAME,
                         lpLCDataA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       lpLCDataA,
                       "Stroke Count",
                       NULL,
                       "A version SSORTNAME 0x00020804",
                       &NumErrors );



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


////////////////////////////////////////////////////////////////////////////
//
//  VER_NormalCase
//
//  This routine tests the normal cases of the VERSION API routines.
//
//  06-14-91    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int VER_NormalCase()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    BYTE pVersionA[BUFSIZE];      // byte buffer for string
    WCHAR pVersionW[BUFSIZE];     // word buffer for string


    //
    //  VerLanguageNameW
    //

    //  Variation 1  -  U.S.
    rc = VerLanguageNameW( 0x0409,
                           pVersionW,
                           BUFSIZE );
    CheckReturnValidW( rc,
                       23,
                       pVersionW,
                       L"English (United States)",
                       "VerLanguageNameW (US)",
                       &NumErrors );

    //  Variation 2  -  Czech
    rc = VerLanguageNameW( 0x0405,
                           pVersionW,
                           BUFSIZE );
    CheckReturnValidW( rc,
                       5,
                       pVersionW,
                       L"Czech",
                       "VerLanguageNameW (Czech)",
                       &NumErrors );


    //
    //  VerLanguageNameA
    //

    //  Variation 1  -  U.S.
    rc = VerLanguageNameA( 0x0409,
                           pVersionA,
                           BUFSIZE );
    CheckReturnValidA( rc,
                       23,
                       pVersionA,
                       "English (United States)",
                       NULL,
                       "VerLanguageNameA (US)",
                       &NumErrors );

    //  Variation 2  -  Czech
    rc = VerLanguageNameA( 0x0405,
                           pVersionA,
                           BUFSIZE );
    CheckReturnValidA( rc,
                       5,
                       pVersionA,
                       "Czech",
                       NULL,
                       "VerLanguageNameA (Czech)",
                       &NumErrors );


    //
    //  Bad locale - Not valid in RC file.
    //

    //  Variation 1  -  SLANGUAGE - invalid (W)
    rc = VerLanguageNameW( LANG_INVALID,
                           pVersionW,
                           BUFSIZE );
    CheckReturnValidW( rc,
                       16,
                       pVersionW,
                       L"Language Neutral",
                       "VerLanguageNameW (invalid)",
                       &NumErrors );

    //  Variation 2  -  SLANGUAGE - invalid (A)
    rc = VerLanguageNameA( LANG_INVALID,
                           pVersionA,
                           BUFSIZE );
    CheckReturnValidA( rc,
                       16,
                       pVersionA,
                       "Language Neutral",
                       NULL,
                       "VerLanguageNameA (invalid)",
                       &NumErrors );


    //
    //  Invalid parameters.
    //

    //  Variation 1  -  wSize - invalid (W)
    pVersionW[0] = 0;
    rc = VerLanguageNameW( 0x0409,
                           pVersionW,
                           0 );
    CheckReturnValidW( rc,
                       0,
                       NULL,
                       NULL,
                       "VerLanguageNameW (invalid size)",
                       &NumErrors );

    //  Variation 2  -  wSize - invalid (A)
    pVersionA[0] = 0;
    rc = VerLanguageNameA( 0x0409,
                           pVersionA,
                           0 );
    CheckReturnValidA( rc,
                       0,
                       NULL,
                       NULL,
                       NULL,
                       "VerLanguageNameA (invalid size)",
                       &NumErrors );

    //  Variation 3  - szLang - invalid (W)
    rc = VerLanguageNameW( 0x0409,
                           NULL,
                           BUFSIZE );
    CheckReturnValidW( rc,
                       0,
                       NULL,
                       NULL,
                       "VerLanguageNameW (invalid buffer)",
                       &NumErrors );

    //  Variation 4  -  szLang - invalid (A)
    pVersionA[0] = 0;
    rc = VerLanguageNameA( 0x0409,
                           NULL,
                           BUFSIZE );
    CheckReturnValidA( rc,
                       0,
                       NULL,
                       NULL,
                       NULL,
                       "VerLanguageNameA (invalid buffer)",
                       &NumErrors );


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