/*++

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

Module Name:

    gtftest.c

Abstract:

    Test module for NLS API GetTimeFormat.

    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:

    04-30-93    JulieB    Created.

--*/



//
//  Include Files.
//

#include "nlstest.h"




//
//  Constant Declarations.
//

#define  BUFSIZE                50          // buffer size in wide chars
#define  GTF_INVALID_FLAGS      ((DWORD)(~(LOCALE_NOUSEROVERRIDE |       \
                                           TIME_NOMINUTESORSECONDS |     \
                                           TIME_NOSECONDS |              \
                                           TIME_NOTIMEMARKER |           \
                                           TIME_FORCE24HOURFORMAT)))

#define  ENGLISH_US             L"3:45:25 AM"
#define  CZECH                  L"3:45:25"
#define  DANISH                 L"03.45.25"

#define  US_NOMINSEC            L"3 AM"
#define  US_NOSEC               L"3:45 AM"
#define  US_NOTM                L"3:45:25"
#define  US_NOTM_NOMINSEC       L"3"
#define  US_NOTM_NOSEC          L"3:45"

#define  CZECH_NOMINSEC         L"3"
#define  CZECH_NOSEC            L"3:45"
#define  CZECH_NOTM             L"3:45:25"
#define  CZECH_NOTM_NOMINSEC    L"3"
#define  CZECH_NOTM_NOSEC       L"3:45"


#define  US_24HR                L"3:45:25 AM"
#define  US_24HR_2              L"15:45:25 PM"
#define  CZECH_24HR             L"3:45:25"
#define  CZECH_24HR_2           L"15:45:25"




//
//  Global Variables.
//

LCID Locale;

SYSTEMTIME SysTime;
SYSTEMTIME SysTime2;

WCHAR lpTimeStr[BUFSIZE];


//
//  Time format buffers must be in line with the pAllLocales global
//  buffer.
//
LPWSTR pTimeAM[] =
{
    L"03:45:25",                                 //  0x0402
    L"\x4e0a\x5348 03:45:25",                    //  0x0404
    L"3:45:25",                                  //  0x0804
    L"3:45:25",                                  //  0x0c04
    L"AM 3:45:25",                               //  0x1004
    L"3:45:25",                                  //  0x0405
    L"03:45:25",                                 //  0x0406
    L"03:45:25",                                 //  0x0407
    L"03:45:25",                                 //  0x0807
    L"03:45:25",                                 //  0x0c07
    L"3:45:25 \x03c0\x03bc",                     //  0x0408
    L"3:45:25 AM",                               //  0x0409
    L"03:45:25",                                 //  0x0809
    L"3:45:25 AM",                               //  0x0c09
    L"3:45:25 AM",                               //  0x1009
    L"3:45:25 a.m.",                             //  0x1409
    L"03:45:25",                                 //  0x1809
    L"3:45:25",                                  //  0x040a
    L"03:45:25 a.m.",                            //  0x080a
    L"3:45:25",                                  //  0x0c0a
    L"3:45:25",                                  //  0x040b
    L"03:45:25",                                 //  0x040c
    L"3:45:25",                                  //  0x080c
    L"03:45:25",                                 //  0x0c0c
    L"03:45:25",                                 //  0x100c
    L"3:45:25",                                  //  0x040e
    L"03:45:25",                                 //  0x040f
    L"3.45.25",                                  //  0x0410
    L"03:45:25",                                 //  0x0810
    L"3:45:25",                                  //  0x0411
    L"\xc624\xc804 3:45:25",                     //  0x0412
    L"3:45:25",                                  //  0x0413
    L"3:45:25",                                  //  0x0813
    L"03:45:25",                                 //  0x0414
    L"03:45:25",                                 //  0x0814
    L"03:45:25",                                 //  0x0415
    L"03:45:25",                                 //  0x0416
    L"3:45:25",                                  //  0x0816
    L"03:45:25",                                 //  0x0418
    L"3:45:25",                                  //  0x0419
    L"3:45:25",                                  //  0x041a
    L"3:45:25",                                  //  0x041b
    L"03:45:25",                                 //  0x041d
    L"03:45:25",                                 //  0x041f
    L"3:45:25"                                   //  0x0424
};

LPWSTR pTimePM[] =
{
    L"15:45:25",                                 //  0x0402
    L"\x4e0b\x5348 03:45:25",                    //  0x0404
    L"15:45:25",                                 //  0x0804
    L"15:45:25",                                 //  0x0c04
    L"PM 3:45:25",                               //  0x1004
    L"15:45:25",                                 //  0x0405
    L"15:45:25",                                 //  0x0406
    L"15:45:25",                                 //  0x0407
    L"15:45:25",                                 //  0x0807
    L"15:45:25",                                 //  0x0c07
    L"3:45:25 \x03bc\x03bc",                     //  0x0408
    L"3:45:25 PM",                               //  0x0409
    L"15:45:25",                                 //  0x0809
    L"3:45:25 PM",                               //  0x0c09
    L"3:45:25 PM",                               //  0x1009
    L"3:45:25 p.m.",                             //  0x1409
    L"15:45:25",                                 //  0x1809
    L"15:45:25",                                 //  0x040a
    L"03:45:25 p.m.",                            //  0x080a
    L"15:45:25",                                 //  0x0c0a
    L"15:45:25",                                 //  0x040b
    L"15:45:25",                                 //  0x040c
    L"15:45:25",                                 //  0x080c
    L"15:45:25",                                 //  0x0c0c
    L"15:45:25",                                 //  0x100c
    L"15:45:25",                                 //  0x040e
    L"15:45:25",                                 //  0x040f
    L"15.45.25",                                 //  0x0410
    L"15:45:25",                                 //  0x0810
    L"15:45:25",                                 //  0x0411
    L"\xc624\xd6c4 3:45:25",                     //  0x0412
    L"15:45:25",                                 //  0x0413
    L"15:45:25",                                 //  0x0813
    L"15:45:25",                                 //  0x0414
    L"15:45:25",                                 //  0x0814
    L"15:45:25",                                 //  0x0415
    L"15:45:25",                                 //  0x0416
    L"15:45:25",                                 //  0x0816
    L"15:45:25",                                 //  0x0418
    L"15:45:25",                                 //  0x0419
    L"15:45:25",                                 //  0x041a
    L"15:45:25",                                 //  0x041b
    L"15:45:25",                                 //  0x041d
    L"15:45:25",                                 //  0x041f
    L"15:45:25"                                  //  0x0424
};




//
//  Forward Declarations.
//

BOOL
InitGetTimeFormat();

int
GTF_BadParamCheck();

int
GTF_NormalCase();

int
GTF_Ansi();





////////////////////////////////////////////////////////////////////////////
//
//  TestGetTimeFormat
//
//  Test routine for GetTimeFormatW API.
//
//  04-30-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

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


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

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

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

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

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

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

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


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

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

    //
    //  Initialize the system time.
    //
    SysTime.wYear = 1993;
    SysTime.wMonth = 5;
    SysTime.wDayOfWeek = 6;
    SysTime.wDay = 1;
    SysTime.wHour = 3;
    SysTime.wMinute = 45;
    SysTime.wSecond = 25;
    SysTime.wMilliseconds = 13;

    SysTime2.wYear = 1993;
    SysTime2.wMonth = 5;
    SysTime2.wDayOfWeek = 6;
    SysTime2.wDay = 1;
    SysTime2.wHour = 15;
    SysTime2.wMinute = 45;
    SysTime2.wSecond = 25;
    SysTime2.wMilliseconds = 13;

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


////////////////////////////////////////////////////////////////////////////
//
//  GTF_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.
//
//  04-30-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GTF_BadParamCheck()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    SYSTEMTIME MyTime;            // structure to hold custom time


    //
    //  Bad Locale.
    //

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


    //
    //  Null Pointers.
    //

    //  Variation 1  -  lpTimeStr = NULL
    rc = GetTimeFormatW( Locale,
                         0,
                         NULL,
                         NULL,
                         NULL,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "lpTimeStr NULL",
                         &NumErrors );


    //
    //  Bad Count.
    //

    //  Variation 1  -  cchTime < 0
    rc = GetTimeFormatW( Locale,
                         0,
                         NULL,
                         NULL,
                         lpTimeStr,
                         -1 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "cchTime < 0",
                         &NumErrors );


    //
    //  Invalid Flag.
    //

    //  Variation 1  -  LCType = invalid
    rc = GetTimeFormatW( Locale,
                         GTF_INVALID_FLAGS,
                         NULL,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "Flag invalid",
                         &NumErrors );

    //  Variation 2  -  lpFormat and NoUserOverride
    rc = GetTimeFormatW( Locale,
                         LOCALE_NOUSEROVERRIDE,
                         NULL,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "lpFormat and NoUserOverride",
                         &NumErrors );

    //  Variation 3  -  Use CP ACP, lpFormat and NoUserOverride
    rc = GetTimeFormatW( Locale,
                         LOCALE_USE_CP_ACP | LOCALE_NOUSEROVERRIDE,
                         NULL,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_FLAGS,
                         "Use CP ACP, lpFormat and NoUserOverride",
                         &NumErrors );


    //
    //  Buffer Too Small.
    //

    //  Variation 1  -  cchTime = too small
    rc = GetTimeFormatW( Locale,
                         0,
                         NULL,
                         NULL,
                         lpTimeStr,
                         2 );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INSUFFICIENT_BUFFER,
                         "cchTime too small",
                         &NumErrors );


    //
    //  Bad time passed in.
    //

    //  Variation 1  -  bad wHour
    MyTime.wYear = 1993;
    MyTime.wMonth = 5;
    MyTime.wDayOfWeek = 6;
    MyTime.wDay = 1;
    MyTime.wHour = 24;
    MyTime.wMinute = 45;
    MyTime.wSecond = 25;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( Locale,
                         0,
                         &MyTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad wHour",
                         &NumErrors );

    //  Variation 2  -  bad wMinute
    MyTime.wYear = 1993;
    MyTime.wMonth = 5;
    MyTime.wDayOfWeek = 6;
    MyTime.wDay = 1;
    MyTime.wHour = 15;
    MyTime.wMinute = 60;
    MyTime.wSecond = 25;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( Locale,
                         0,
                         &MyTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad wMinute",
                         &NumErrors );

    //  Variation 3  -  bad wSecond
    MyTime.wYear = 1993;
    MyTime.wMonth = 5;
    MyTime.wDayOfWeek = 6;
    MyTime.wDay = 1;
    MyTime.wHour = 15;
    MyTime.wMinute = 45;
    MyTime.wSecond = 60;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( Locale,
                         0,
                         &MyTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad wSecond",
                         &NumErrors );

    //  Variation 4  -  bad wMilliseconds
    MyTime.wYear = 1993;
    MyTime.wMonth = 5;
    MyTime.wDayOfWeek = 6;
    MyTime.wDay = 1;
    MyTime.wHour = 15;
    MyTime.wMinute = 45;
    MyTime.wSecond = 25;
    MyTime.wMilliseconds = 1000;
    rc = GetTimeFormatW( Locale,
                         0,
                         &MyTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnBadParam( rc,
                         0,
                         ERROR_INVALID_PARAMETER,
                         "bad wMilliseconds",
                         &NumErrors );


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


////////////////////////////////////////////////////////////////////////////
//
//  GTF_NormalCase
//
//  This routine tests the normal cases of the API routine.
//
//  04-30-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GTF_NormalCase()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    SYSTEMTIME MyTime;            // structure to hold custom time
    int ctr;                      // loop counter


#ifdef PERF

  DbgBreakPoint();

#endif


    //
    //  Locales.
    //

    //  Variation 1  -  System Default Locale
    rc = GetTimeFormatW( LOCALE_SYSTEM_DEFAULT,
                         0,
                         NULL,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnEqual( rc,
                      0,
                      "system default locale",
                      &NumErrors );

    //  Variation 2  -  Current User Locale
    rc = GetTimeFormatW( LOCALE_USER_DEFAULT,
                         0,
                         NULL,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnEqual( rc,
                      0,
                      "current user locale",
                      &NumErrors );


    //
    //  Language Neutral.
    //

    //  Variation 1  -  neutral
    rc = GetTimeFormatW( 0x0000,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       ENGLISH_US,
                       "neutral locale",
                       &NumErrors );

    //  Variation 2  -  sys default
    rc = GetTimeFormatW( 0x0400,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       ENGLISH_US,
                       "sys default locale",
                       &NumErrors );

    //  Variation 3  -  user default
    rc = GetTimeFormatW( 0x0800,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       ENGLISH_US,
                       "user default locale",
                       &NumErrors );

    //  Variation 4  -  sub lang neutral US
    rc = GetTimeFormatW( 0x0009,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       ENGLISH_US,
                       "sub lang neutral US",
                       &NumErrors );

    //  Variation 5  -  sub lang neutral Czech
    rc = GetTimeFormatW( 0x0005,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH,
                       "sub lang neutral Czech",
                       &NumErrors );


    //
    //  Use CP ACP.
    //

    //  Variation 1  -  Use CP ACP, System Default Locale
    rc = GetTimeFormatW( LOCALE_SYSTEM_DEFAULT,
                         LOCALE_USE_CP_ACP,
                         NULL,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnEqual( rc,
                      0,
                      "Use CP ACP, system default locale",
                      &NumErrors );


    //
    //  cchTime.
    //

    //  Variation 1  -  cchTime = size of lpTimeStr buffer
    rc = GetTimeFormatW( Locale,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       ENGLISH_US,
                       "cchTime = bufsize",
                       &NumErrors );

    //  Variation 2  -  cchTime = 0
    lpTimeStr[0] = 0x0000;
    rc = GetTimeFormatW( Locale,
                         0,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         0 );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       ENGLISH_US,
                       "cchTime zero",
                       &NumErrors );

    //  Variation 3  -  cchTime = 0, lpTimeStr = NULL
    rc = GetTimeFormatW( Locale,
                         0,
                         &SysTime,
                         NULL,
                         NULL,
                         0 );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       ENGLISH_US,
                       "cchTime (NULL ptr)",
                       &NumErrors );


    //
    //  lpFormat.
    //

    //  Variation 1  -  AM/PM
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &SysTime,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"AM 03:45:25",
                       "lpFormat AM/PM (tt hh:mm:ss)",
                       &NumErrors );

    //  Variation 2  -  AM/PM
    rc = GetTimeFormatW( 0x0409,
                         TIME_NOTIMEMARKER,
                         &SysTime,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"03:45:25",
                       "lpFormat NoTimeMarker (tt hh:mm:ss)",
                       &NumErrors );

    //  Variation 3  -  AM/PM
    rc = GetTimeFormatW( 0x0409,
                         TIME_NOTIMEMARKER | TIME_NOSECONDS,
                         &SysTime,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"03:45",
                       "lpFormat NoTimeMarker, NoSeconds (tt hh:mm:ss)",
                       &NumErrors );

    //  Variation 4  -  AM/PM
    rc = GetTimeFormatW( 0x0409,
                         TIME_NOTIMEMARKER | TIME_NOMINUTESORSECONDS,
                         &SysTime,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"03",
                       "lpFormat NoTimeMarker, NoMinutesOrSeconds (tt hh:mm:ss)",
                       &NumErrors );

    //  Variation 5  -  AM/PM
    rc = GetTimeFormatW( 0x0409,
                         TIME_NOMINUTESORSECONDS,
                         &SysTime,
                         L"tt hh:mm:ss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"AM 03",
                       "lpFormat NoMinutesOrSeconds (tt hh:mm:ss)",
                       &NumErrors );

    //  Variation 6  -  Extra h, m, s
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &SysTime,
                         L"hhh:mmm:sss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"03:45:25",
                       "lpFormat (hhh:mmm:sss)",
                       &NumErrors );

    //  Variation 7  -  Extra H, m, s
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &SysTime2,
                         L"HHH:mmm:sss",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"15:45:25",
                       "lpFormat (HHH:mmm:sss)",
                       &NumErrors );

    //  Variation 8  -  h:m:s
    MyTime.wHour = 15;
    MyTime.wMinute = 4;
    MyTime.wSecond = 5;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &MyTime,
                         L"h:m:s",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"3:4:5",
                       "lpFormat (h:m:s)",
                       &NumErrors );

    //  Variation 9  -  H:m:s
    MyTime.wHour = 15;
    MyTime.wMinute = 4;
    MyTime.wSecond = 5;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &MyTime,
                         L"H:m:s",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"15:4:5",
                       "lpFormat (H:m:s)",
                       &NumErrors );

    //  Variation 10  -  single quote
    MyTime.wHour = 15;
    MyTime.wMinute = 4;
    MyTime.wSecond = 5;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &MyTime,
                         L"h 'oclock'",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"3 oclock",
                       "lpFormat (h 'oclock')",
                       &NumErrors );

    //  Variation 11  -  single quote
    MyTime.wHour = 15;
    MyTime.wMinute = 4;
    MyTime.wSecond = 5;
    MyTime.wMilliseconds = 13;
    rc = GetTimeFormatW( 0x0409,
                         0,
                         &MyTime,
                         L"h 'o''clock' tt",
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       L"3 o'clock PM",
                       "lpFormat (h 'o''clock' tt)",
                       &NumErrors );


    //
    //  Flag values.
    //

    //  Variation 1  -  NOUSEROVERRIDE
    rc = GetTimeFormatW( Locale,
                         LOCALE_NOUSEROVERRIDE,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       ENGLISH_US,
                       "NoUserOverride",
                       &NumErrors );

    //  Variation 2  -  US NOMINUTESORSECONDS
    rc = GetTimeFormatW( Locale,
                         TIME_NOMINUTESORSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOMINSEC,
                       "US NoMinutesOrSeconds",
                       &NumErrors );

    //  Variation 3  -  US NOSECONDS
    rc = GetTimeFormatW( Locale,
                         TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOSEC,
                       "US NoSeconds",
                       &NumErrors );

    //  Variation 4  -  US NOMINUTESORSECONDS and NOSECONDS
    rc = GetTimeFormatW( Locale,
                         TIME_NOMINUTESORSECONDS | TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOMINSEC,
                       "US NoMinutesOrSeconds, NoSeconds",
                       &NumErrors );

    //  Variation 5  -  US NOTIMEMARKER
    rc = GetTimeFormatW( Locale,
                         TIME_NOTIMEMARKER,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOTM,
                       "US NoTimeMarker",
                       &NumErrors );

    //  Variation 6  -  US NOTIMEMARKER and NOMINUTESORSECONDS
    rc = GetTimeFormatW( Locale,
                         TIME_NOTIMEMARKER | TIME_NOMINUTESORSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOTM_NOMINSEC,
                       "US NoTimeMarker, NoMinutesOrSeconds",
                       &NumErrors );

    //  Variation 7  -  US NOTIMEMARKER and NOSECONDS
    rc = GetTimeFormatW( Locale,
                         TIME_NOTIMEMARKER | TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOTM_NOSEC,
                       "US NoTimeMarker, NoSeconds",
                       &NumErrors );

    //  Variation 8  -  US NOTIMEMARKER and NOMINUTESORSECONDS and NOSECONDS
    rc = GetTimeFormatW( Locale,
                         TIME_NOTIMEMARKER | TIME_NOMINUTESORSECONDS | TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_NOTM_NOMINSEC,
                       "US NoTimeMarker, NoMinutesOrSeconds, NoSeconds",
                       &NumErrors );

    //  Variation 9  -  CZECH NOMINUTESORSECONDS
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOMINUTESORSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOMINSEC,
                       "Czech NoMinutesOrSeconds",
                       &NumErrors );

    //  Variation 10 -  CZECH NOSECONDS
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOSEC,
                       "Czech NoSeconds",
                       &NumErrors );

    //  Variation 11 -  CZECH NOMINUTESORSECONDS and NOSECONDS
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOMINUTESORSECONDS | TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOMINSEC,
                       "Czech NoMinutesOrSeconds, NoSeconds",
                       &NumErrors );

    //  Variation 12 -  CZECH NOTIMEMARKER
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOTIMEMARKER,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOTM,
                       "Czech NoTimeMarker",
                       &NumErrors );

    //  Variation 13 -  CZECH NOTIMEMARKER and NOMINUTESORSECONDS
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOTIMEMARKER | TIME_NOMINUTESORSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOTM_NOMINSEC,
                       "Czech NoTimeMarker, NoMinutesOrSeconds",
                       &NumErrors );

    //  Variation 14 -  CZECH NOTIMEMARKER and NOSECONDS
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOTIMEMARKER | TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOTM_NOSEC,
                       "Czech NoTimeMarker, NoSeconds",
                       &NumErrors );

    //  Variation 15 -  CZECH NOTIMEMARKER and NOMINUTESORSECONDS and NOSECONDS
    rc = GetTimeFormatW( 0x0405,
                         TIME_NOTIMEMARKER | TIME_NOMINUTESORSECONDS | TIME_NOSECONDS,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_NOTM_NOMINSEC,
                       "Czech NoTimeMarker, NoMinutesOrSeconds, NoSeconds",
                       &NumErrors );


    //  Variation 16  -  US FORCE24HOURFORMAT
    rc = GetTimeFormatW( Locale,
                         TIME_FORCE24HOURFORMAT,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_24HR,
                       "US Force24HourFormat 1",
                       &NumErrors );

    //  Variation 17  -  US FORCE24HOURFORMAT
    rc = GetTimeFormatW( Locale,
                         TIME_FORCE24HOURFORMAT,
                         &SysTime2,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       US_24HR_2,
                       "US Force24HourFormat 2",
                       &NumErrors );

    //  Variation 18 -  CZECH FORCE24HOURFORMAT
    rc = GetTimeFormatW( 0x0405,
                         TIME_FORCE24HOURFORMAT,
                         &SysTime,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_24HR,
                       "Czech Force24HourFormat",
                       &NumErrors );

    //  Variation 19 -  CZECH FORCE24HOURFORMAT
    rc = GetTimeFormatW( 0x0405,
                         TIME_FORCE24HOURFORMAT,
                         &SysTime2,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       lpTimeStr,
                       CZECH_24HR_2,
                       "Czech Force24HourFormat 2",
                       &NumErrors );



    //
    //  Test all locales - 3:45:25 AM
    //

    for (ctr = 0; ctr < NumLocales; ctr++)
    {
        rc = GetTimeFormatW( pAllLocales[ctr],
                             0,
                             &SysTime,
                             NULL,
                             lpTimeStr,
                             BUFSIZE );
        CheckReturnValidLoopW( rc,
                               -1,
                               lpTimeStr,
                               pTimeAM[ctr],
                               "Time AM",
                               pAllLocales[ctr],
                               &NumErrors );
    }


    //
    //  Test all locales - 3:45:25 PM
    //

    for (ctr = 0; ctr < NumLocales; ctr++)
    {
        rc = GetTimeFormatW( pAllLocales[ctr],
                             0,
                             &SysTime2,
                             NULL,
                             lpTimeStr,
                             BUFSIZE );
        CheckReturnValidLoopW( rc,
                               -1,
                               lpTimeStr,
                               pTimePM[ctr],
                               "Time PM",
                               pAllLocales[ctr],
                               &NumErrors );
    }



    //
    //  System Time.
    //
    //  NOTE: For this test, must use a locale that has the same length
    //        for both the AM and PM, since I don't check if the test
    //        is run in the AM or PM.
    //

    //  Variation 1  -  Danish system time
    rc = GetTimeFormatW( 0x0406,
                         0,
                         NULL,
                         NULL,
                         lpTimeStr,
                         BUFSIZE );
    CheckReturnValidW( rc,
                       -1,
                       NULL,
                       DANISH,
                       "Danish System Time",
                       &NumErrors );



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


////////////////////////////////////////////////////////////////////////////
//
//  GTF_Ansi
//
//  This routine tests the Ansi version of the API routine.
//
//  04-30-93    JulieB    Created.
////////////////////////////////////////////////////////////////////////////

int GTF_Ansi()
{
    int NumErrors = 0;            // error count - to be returned
    int rc;                       // return code
    SYSTEMTIME MyTime;            // structure to hold custom time
    BYTE pTimeStrA[BUFSIZE];      // ptr to time string


    MyTime.wYear = 1993;
    MyTime.wMonth = 5;
    MyTime.wDayOfWeek = 6;
    MyTime.wDay = 1;
    MyTime.wHour = 15;
    MyTime.wMinute = 4;
    MyTime.wSecond = 5;
    MyTime.wMilliseconds = 13;


    //
    //  GetTimeFormatA
    //

    //  Variation 1  -  AM/PM
    rc = GetTimeFormatA( 0x0409,
                         0,
                         &MyTime,
                         "tt hh:mm:ss",
                         pTimeStrA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       pTimeStrA,
                       "PM 03:04:05",
                       NULL,
                       "A version (tt hh:mm:ss)",
                       &NumErrors );

    //  Variation 2  -  AM/PM (no dest)
    rc = GetTimeFormatA( 0x0409,
                         0,
                         &MyTime,
                         "tt hh:mm:ss",
                         NULL,
                         0 );
    CheckReturnValidA( rc,
                       -1,
                       NULL,
                       "PM 03:04:05",
                       NULL,
                       "A version (tt hh:mm:ss), no Dest",
                       &NumErrors );


    //
    //  Use CP ACP.
    //

    //  Variation 1  -  Use CP ACP, AM/PM
    rc = GetTimeFormatA( 0x0409,
                         LOCALE_USE_CP_ACP,
                         &MyTime,
                         "tt hh:mm:ss",
                         pTimeStrA,
                         BUFSIZE );
    CheckReturnValidA( rc,
                       -1,
                       pTimeStrA,
                       "PM 03:04:05",
                       NULL,
                       "A version Use CP ACP (tt hh:mm:ss)",
                       &NumErrors );



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