/*++

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

Module Name:

    elgltest.c

Abstract:

    Test module for NLS API EnumLanguageGroupLocales.

    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:

    03-10-98    JulieB    Created.

--*/



//
//  Include Files.
//

#include "nlstest.h"




//
//  Constant Declarations.
//

#define  BUFSIZE              50            // buffer size in wide chars
#define  ELGL_INVALID_FLAGS   ((DWORD)(~(0)))

#define  NUM_LG1_LOCALES      67
#define  NUM_LG2_LOCALES      10
#define  NUM_LG3_LOCALES      3
#define  NUM_LG4_LOCALES      1
#define  NUM_LG5_LOCALES      12
#define  NUM_LG6_LOCALES      3
#define  NUM_LG7_LOCALES      1
#define  NUM_LG8_LOCALES      1
#define  NUM_LG9_LOCALES      5
#define  NUM_LG10_LOCALES     4
#define  NUM_LG11_LOCALES     1
#define  NUM_LG12_LOCALES     1
#define  NUM_LG13_LOCALES     20
#define  NUM_LG14_LOCALES     1
#define  NUM_LG15_LOCALES     9
#define  NUM_LG16_LOCALES     2
#define  NUM_LG17_LOCALES     1




//
//  Global Variables.
//

int LocaleCtr;




//
//  Forward Declarations.
//

BOOL
InitEnumLanguageGroupLocales();

int
ELGL_BadParamCheck();

int
ELGL_NormalCase();

int
ELGL_Ansi();

BOOL
CALLBACK
MyFuncLanguageGroupLocale(
    LGRPID LangGroup,
    LCID Locale,
    LPWSTR pStr,
    LONG_PTR lParam);

BOOL
CALLBACK
MyFuncLanguageGroupLocaleA(
    LGRPID LangGroup,
    LCID Locale,
    LPSTR pStr,
    LONG_PTR lParam);




//
//  Callback function
//

BOOL CALLBACK MyFuncLanguageGroupLocale(
    LGRPID LangGroup,
    LCID Locale,
    LPWSTR pStr,
    LONG_PTR lParam)
{
    if (Verbose)
    {
        printf("%x", LangGroup);
        printf("    -    ");
        printf("%x", Locale);
        printf("    -    ");
        while (*pStr)
        {
            printf((*pStr > 0xff) ? "(0x%x)" : "%wc", *pStr);
            pStr++;
        }
        printf("\n");
    }

    LocaleCtr++;

    return (TRUE);
}


BOOL CALLBACK MyFuncLanguageGroupLocaleA(
    LGRPID LangGroup,
    LCID Locale,
    LPSTR pStr,
    LONG_PTR lParam)
{
    if (Verbose)
    {
        printf("%x", LangGroup);
        printf("    -    ");
        printf("%x", Locale);
        printf("    -    ");
        while (*pStr)
        {
            printf((*pStr > 0xff) ? "(0x%x)" : "%c", *pStr);
            pStr++;
        }
        printf("\n");
    }

    LocaleCtr++;

    return (TRUE);
}





////////////////////////////////////////////////////////////////////////////
//
//  TestEnumLanguageGroupLocales
//
//  Test routine for EnumLanguageGroupLocalesW API.
//
//  03-10-98    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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

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

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

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

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

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

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


////////////////////////////////////////////////////////////////////////////
//
//  InitEnumLanguageGroupLocales
//
//  This routine initializes the global variables.  If no errors were
//  encountered, then it returns TRUE.  Otherwise, it returns FALSE.
//
//  03-10-98    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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

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


////////////////////////////////////////////////////////////////////////////
//
//  ELGL_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.
//
//  03-10-98    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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



    //
    //  Invalid Function.
    //

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


    //
    //  Invalid Flag.
    //

    //  Variation 1  -  dwFlags = invalid
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    1,
                                    ELGL_INVALID_FLAGS,
                                    0 );
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_FLAGS,
                             "Flag invalid",
                             &NumErrors,
                             LocaleCtr,
                             0 );

    //  Variation 2  -  dwFlags = both invalid
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    1,
                                    LGRPID_INSTALLED | LGRPID_SUPPORTED,
                                    0 );
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_FLAGS,
                             "Flag both invalid",
                             &NumErrors,
                             LocaleCtr,
                             0 );


    //
    //  Invalid Language Group.
    //

    //  Variation 1  -  LanguageGroup = invalid
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    0,
                                    0,
                                    0 );
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_PARAMETER,
                             "LanguageGroup invalid (0)",
                             &NumErrors,
                             LocaleCtr,
                             0 );

    //  Variation 2  -  LanguageGroup = invalid
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    18,
                                    0,
                                    0 );
    CheckReturnBadParamEnum( rc,
                             FALSE,
                             ERROR_INVALID_PARAMETER,
                             "LanguageGroup invalid (18)",
                             &NumErrors,
                             LocaleCtr,
                             0 );


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


////////////////////////////////////////////////////////////////////////////
//
//  ELGL_NormalCase
//
//  This routine tests the normal cases of the API routine.
//
//  03-10-98    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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

    //  Variation 1  -  Language Group 1
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    1,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG1_LOCALES,
                          "LanguageGroup 1",
                          &NumErrors );

    //  Variation 2  -  Language Group 2
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    2,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG2_LOCALES,
                          "LanguageGroup 2",
                          &NumErrors );

    //  Variation 3  -  Language Group 3
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    3,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG3_LOCALES,
                          "LanguageGroup 3",
                          &NumErrors );

    //  Variation 4  -  Language Group 4
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    4,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG4_LOCALES,
                          "LanguageGroup 4",
                          &NumErrors );

    //  Variation 5  -  Language Group 5
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    5,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG5_LOCALES,
                          "LanguageGroup 5",
                          &NumErrors );

    //  Variation 6  -  Language Group 6
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    6,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG6_LOCALES,
                          "LanguageGroup 6",
                          &NumErrors );

    //  Variation 7  -  Language Group 7
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    7,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG7_LOCALES,
                          "LanguageGroup 7",
                          &NumErrors );

    //  Variation 8  -  Language Group 8
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    8,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG8_LOCALES,
                          "LanguageGroup 8",
                          &NumErrors );

    //  Variation 9  -  Language Group 9
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    9,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG9_LOCALES,
                          "LanguageGroup 9",
                          &NumErrors );

    //  Variation 10  -  Language Group 10
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    10,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG10_LOCALES,
                          "LanguageGroup 10",
                          &NumErrors );

    //  Variation 11  -  Language Group 11
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    11,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG11_LOCALES,
                          "LanguageGroup 11",
                          &NumErrors );

    //  Variation 12  -  Language Group 12
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    12,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG12_LOCALES,
                          "LanguageGroup 12",
                          &NumErrors );

    //  Variation 13  -  Language Group 13
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    13,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG13_LOCALES,
                          "LanguageGroup 13",
                          &NumErrors );

    //  Variation 14  -  Language Group 14
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    14,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG14_LOCALES,
                          "LanguageGroup 14",
                          &NumErrors );

    //  Variation 15  -  Language Group 15
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    15,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG15_LOCALES,
                          "LanguageGroup 15",
                          &NumErrors );

    //  Variation 16  -  Language Group 16
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    16,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG16_LOCALES,
                          "LanguageGroup 16",
                          &NumErrors );

    //  Variation 17  -  Language Group 17
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesW( MyFuncLanguageGroupLocale,
                                    17,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG17_LOCALES,
                          "LanguageGroup 17",
                          &NumErrors );


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


////////////////////////////////////////////////////////////////////////////
//
//  ELGL_Ansi
//
//  This routine tests the Ansi version of the API routine.
//
//  03-10-98    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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

    //  Variation 1  -  Language Group 1
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    1,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG1_LOCALES,
                          "A version Language Group 1",
                          &NumErrors );

    //  Variation 2  -  Language Group 2
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    2,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG2_LOCALES,
                          "A version Language Group 2",
                          &NumErrors );

    //  Variation 3  -  Language Group 3
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    3,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG3_LOCALES,
                          "A version Language Group 3",
                          &NumErrors );

    //  Variation 4  -  Language Group 4
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    4,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG4_LOCALES,
                          "A version Language Group 4",
                          &NumErrors );

    //  Variation 5  -  Language Group 5
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    5,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG5_LOCALES,
                          "A version Language Group 5",
                          &NumErrors );

    //  Variation 6  -  Language Group 6
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    6,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG6_LOCALES,
                          "A version Language Group 6",
                          &NumErrors );

    //  Variation 7  -  Language Group 7
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    7,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG7_LOCALES,
                          "A version Language Group 7",
                          &NumErrors );

    //  Variation 8  -  Language Group 8
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    8,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG8_LOCALES,
                          "A version Language Group 8",
                          &NumErrors );

    //  Variation 9  -  Language Group 9
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    9,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG9_LOCALES,
                          "A version Language Group 9",
                          &NumErrors );

    //  Variation 10  -  Language Group 10
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    10,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG10_LOCALES,
                          "A version Language Group 10",
                          &NumErrors );

    //  Variation 11  -  Language Group 11
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    11,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG11_LOCALES,
                          "A version Language Group 11",
                          &NumErrors );

    //  Variation 12  -  Language Group 12
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    12,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG12_LOCALES,
                          "A version Language Group 12",
                          &NumErrors );

    //  Variation 13  -  Language Group 13
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    13,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG13_LOCALES,
                          "A version Language Group 13",
                          &NumErrors );

    //  Variation 14  -  Language Group 14
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    14,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG14_LOCALES,
                          "A version Language Group 14",
                          &NumErrors );

    //  Variation 15  -  Language Group 15
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    15,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG15_LOCALES,
                          "A version Language Group 15",
                          &NumErrors );

    //  Variation 16  -  Language Group 16
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    16,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG16_LOCALES,
                          "A version Language Group 16",
                          &NumErrors );

    //  Variation 17  -  Language Group 17
    LocaleCtr = 0;
    rc = EnumLanguageGroupLocalesA( MyFuncLanguageGroupLocaleA,
                                    17,
                                    0,
                                    0 );
    CheckReturnValidEnum( rc,
                          TRUE,
                          LocaleCtr,
                          NUM_LG17_LOCALES,
                          "A version Language Group 17",
                          &NumErrors );


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