/*++

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

Module Name:

    esltest.c

Abstract:

    Test module for NLS API EnumSystemLocales.

    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:

    08-02-93    JulieB    Created.

--*/



//
//  Include Files.
//

#include "nlstest.h"




//
//  Constant Declarations.
//

#define  BUFSIZE              50            // buffer size in wide chars
#define  ESL_INVALID_FLAGS    ((DWORD)(~(LCID_INSTALLED | LCID_SUPPORTED)))

#define  NUM_INSTALLED_LCIDS  135
#define  NUM_SUPPORTED_LCIDS  135
#define  NUM_ALTERNATE_SORTS  7




//
//  Global Variables.
//

int LocaleCtr;




//
//  Forward Declarations.
//

BOOL
InitEnumSystemLocales();

int
ESL_BadParamCheck();

int
ESL_NormalCase();

int
ESL_Ansi();

BOOL
CALLBACK
MyFuncLocale(
    LPWSTR pStr);

BOOL
CALLBACK
MyFuncLocaleA(
    LPSTR pStr);




//
//  Callback function
//

BOOL CALLBACK MyFuncLocale(
    LPWSTR pStr)
{
    if (Verbose)
    {
        while (*pStr)
        {
//            printf((*pStr > 0xff) ? "(0x%x)" : "%wc", *pStr);
            printf("%wc", *pStr);
            pStr++;
        }
        printf("\n");
    }

    LocaleCtr++;

    return (TRUE);
}


BOOL CALLBACK MyFuncLocaleA(
    LPSTR pStr)
{
    if (Verbose)
    {
        while (*pStr)
        {
            printf((*pStr > 0xff) ? "(0x%x)" : "%c", *pStr);
            pStr++;
        }
        printf("\n");
    }

    LocaleCtr++;

    return (TRUE);
}





////////////////////////////////////////////////////////////////////////////
//
//  TestEnumSystemLocales
//
//  Test routine for EnumSystemLocalesW API.
//
//  08-02-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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

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

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

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

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

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

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


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

BOOL InitEnumSystemLocales()
{
    //
    //  Initialize locale counter.
    //
    LocaleCtr = 0;

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


////////////////////////////////////////////////////////////////////////////
//
//  ESL_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.
//
//  08-02-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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



    //
    //  Invalid Function.
    //

    //  Variation 1  -  Function = invalid
    LocaleCtr = 0;
    rc = EnumSystemLocalesW( NULL,
                             LCID_INSTALLED );
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_PARAMETER,
                             "Function invalid",
                             &NumErrors,
                             LocaleCtr,
                             0 );


    //
    //  Invalid Flag.
    //

    //  Variation 1  -  dwFlags = invalid
    LocaleCtr = 0;
    rc = EnumSystemLocalesW(MyFuncLocale, ESL_INVALID_FLAGS);
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_FLAGS,
                             "Flag invalid",
                             &NumErrors,
                             LocaleCtr,
                             0 );

    //  Variation 2  -  dwFlags = both invalid
    LocaleCtr = 0;
    rc = EnumSystemLocalesW(MyFuncLocale, LCID_INSTALLED | LCID_SUPPORTED);
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_FLAGS,
                             "Flag both invalid",
                             &NumErrors,
                             LocaleCtr,
                             0 );


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


////////////////////////////////////////////////////////////////////////////
//
//  ESL_NormalCase
//
//  This routine tests the normal cases of the API routine.
//
//  08-02-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


    if (Verbose)
    {
        printf("\n----  W version  ----\n\n");
    }

    //  Variation 1  -  Installed
    LocaleCtr = 0;
    rc = EnumSystemLocalesW( MyFuncLocale,
                             LCID_INSTALLED );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_INSTALLED_LCIDS,
                          "Flag installed",
                          &NumErrors );

    //  Variation 2  -  Supported
    LocaleCtr = 0;
    rc = EnumSystemLocalesW( MyFuncLocale,
                             LCID_SUPPORTED );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_SUPPORTED_LCIDS,
                          "Flag supported",
                          &NumErrors );

    //  Variation 3  -  Alternate Sorts
    LocaleCtr = 0;
    rc = EnumSystemLocalesW( MyFuncLocale,
                             LCID_ALTERNATE_SORTS );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_ALTERNATE_SORTS,
                          "Flag alternate sorts",
                          &NumErrors );


    //  Variation 4  -  Installed, Alternate Sorts
    LocaleCtr = 0;
    rc = EnumSystemLocalesW( MyFuncLocale,
                             LCID_INSTALLED | LCID_ALTERNATE_SORTS );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_INSTALLED_LCIDS + NUM_ALTERNATE_SORTS,
                          "Flag installed, alternate sorts",
                          &NumErrors );


    //  Variation 5  -  Supported, Alternate Sorts
    LocaleCtr = 0;
    rc = EnumSystemLocalesW( MyFuncLocale,
                             LCID_SUPPORTED | LCID_ALTERNATE_SORTS );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_SUPPORTED_LCIDS + NUM_ALTERNATE_SORTS,
                          "Flag supported, alternate sorts",
                          &NumErrors );



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


////////////////////////////////////////////////////////////////////////////
//
//  ESL_Ansi
//
//  This routine tests the Ansi version of the API routine.
//
//  08-02-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


    if (Verbose)
    {
        printf("\n----  A version  ----\n\n");
    }

    //  Variation 1  -  installed
    LocaleCtr = 0;
    rc = EnumSystemLocalesA( MyFuncLocaleA,
                             LCID_INSTALLED );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_INSTALLED_LCIDS,
                          "A version Flag installed",
                          &NumErrors );

    //  Variation 2  -  Supported
    LocaleCtr = 0;
    rc = EnumSystemLocalesA( MyFuncLocaleA,
                             LCID_SUPPORTED );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_SUPPORTED_LCIDS,
                          "A version Flag supported",
                          &NumErrors );

    //  Variation 3  -  Alternate Sorts
    LocaleCtr = 0;
    rc = EnumSystemLocalesA( MyFuncLocaleA,
                             LCID_ALTERNATE_SORTS );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_ALTERNATE_SORTS,
                          "A version Flag alternate sorts",
                          &NumErrors );


    //  Variation 4  -  Installed, Alternate Sorts
    LocaleCtr = 0;
    rc = EnumSystemLocalesA( MyFuncLocaleA,
                             LCID_INSTALLED | LCID_ALTERNATE_SORTS );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_INSTALLED_LCIDS + NUM_ALTERNATE_SORTS,
                          "A version Flag installed, alternate sorts",
                          &NumErrors );


    //  Variation 5  -  Supported, Alternate Sorts
    LocaleCtr = 0;
    rc = EnumSystemLocalesA( MyFuncLocaleA,
                             LCID_SUPPORTED | LCID_ALTERNATE_SORTS );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_SUPPORTED_LCIDS + NUM_ALTERNATE_SORTS,
                          "A version Flag supported, alternate sorts",
                          &NumErrors );


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