/*++ Copyright (c) 1991-1999, Microsoft Corporation All rights reserved. Module Name: gcitest.c Abstract: Test module for NLS API GetCalendarInfo. 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 CALTYPE_INVALID 0x0000100 // invalid CALTYPE #define LANG_INVALID 0x0417 // invalid lang id #define S_ITWODIGITYEARMAX L"2029" #define I_ITWODIGITYEARMAX 2029 // // Global Variables. // LCID Locale; WCHAR lpCalData[BUFSIZE]; BYTE lpCalDataA[BUFSIZE]; // // pCalInfoFlag and pCalString must have the same number of entries. // CALTYPE pCalInfoFlag[] = { CAL_ICALINTVALUE, CAL_SCALNAME, CAL_ITWODIGITYEARMAX, CAL_IYEAROFFSETRANGE, CAL_SERASTRING, CAL_SSHORTDATE, CAL_SLONGDATE, CAL_SYEARMONTH, CAL_SDAYNAME1, CAL_SMONTHNAME1, CAL_SMONTHNAME13 }; #define NUM_CAL_FLAGS ( sizeof(pCalInfoFlag) / sizeof(CALTYPE) ) LPWSTR pCalString[] = { L"1", L"Gregorian Calendar", L"2029", L"0", L"", L"M/d/yyyy", L"dddd, MMMM dd, yyyy", L"MMMM, yyyy", L"Monday", L"January", L"" }; LPWSTR pCalStringJapan[] = { L"3", L"\x548c\x66a6", L"99", L"1989", L"\x5e73\x6210", L"gg y/M/d", L"gg y'\x5e74'M'\x6708'd'\x65e5'", L"gg y'\x5e74'M'\x6708'", L"\x6708\x66dc\x65e5", L"1\x6708", L"" }; LPWSTR pCalStringHebrew[] = { L"8", L"\x05dc\x05d5\x05d7\x00a0\x05e9\x05e0\x05d4\x00a0\x05e2\x05d1\x05e8\x05d9", L"5790", L"0", L"", L"dd/MMM/yyyy", L"dddd dd MMMM yyyy", L"MMMM yyyy", L"\x05d9\x05d5\x05dd\x00a0\x05e9\x05e0\x05d9", L"\x05ea\x05e9\x05e8\x05d9", L"\x05d0\x05dc\x05d5\x05dc" }; // // pCalIntFlag and pCalInt must have the same number of entries. // CALTYPE pCalIntFlag[] = { CAL_ICALINTVALUE, CAL_ITWODIGITYEARMAX, CAL_IYEAROFFSETRANGE, }; #define NUM_CAL_INT_FLAGS ( sizeof(pCalIntFlag) / sizeof(CALTYPE) ) int pCalInt[] = { 1, 2029, 0 }; int pCalIntJapan[] = { 3, 99, 1989 }; // // Forward Declarations. // BOOL InitGetCalInfo(); int GCI_BadParamCheck(); int GCI_NormalCase(); int GCI_Ansi(); //////////////////////////////////////////////////////////////////////////// // // TestGetCalendarInfo // // Test routine for GetCalendarInfoW API. // // 03-10-98 JulieB Created. //////////////////////////////////////////////////////////////////////////// int TestGetCalendarInfo() { int ErrCount = 0; // error count // // Print out what's being done. // printf("\n\nTESTING GetCalendarInfoW...\n\n"); // // Initialize global variables. // if (!InitGetCalInfo()) { printf("\nABORTED TestGetCalendarInfo: Could not Initialize.\n"); return (1); } // // Test bad parameters. // ErrCount += GCI_BadParamCheck(); // // Test normal cases. // ErrCount += GCI_NormalCase(); // // Test Ansi version. // ErrCount += GCI_Ansi(); // // Print out result. // printf("\nGetCalendarInfoW: ERRORS = %d\n", ErrCount); // // Return total number of errors found. // return (ErrCount); } //////////////////////////////////////////////////////////////////////////// // // InitGetCalInfo // // 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 InitGetCalInfo() { // // Make a Locale. // Locale = MAKELCID(0x0409, 0); // // Return success. // return (TRUE); } //////////////////////////////////////////////////////////////////////////// // // GCI_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 GCI_BadParamCheck() { DWORD dwValue; // value int NumErrors = 0; // error count - to be returned int rc; // return code // // Bad Locale. // // Variation 1 - Bad Locale rc = GetCalendarInfoW( (LCID)333, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "Bad Locale", &NumErrors ); // Variation 2 - Bad Locale rc = GetCalendarInfoW( LANG_INVALID, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "invalid locale - invalid", &NumErrors ); // // Null Pointers. // // Variation 1 - lpCalData = NULL rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, NULL, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "lpCalData NULL", &NumErrors ); // // Bad Counts. // // Variation 1 - cchData < 0 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, -1, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "cchData < 0", &NumErrors ); // // Zero or Invalid Type. // // Variation 1 - CalType = invalid rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CALTYPE_INVALID, lpCalData, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "CalType invalid", &NumErrors ); // Variation 2 - CalType = 0 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, 0, lpCalData, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "CalType zero", &NumErrors ); // Variation 3 - Use CP ACP, CalType = invalid rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_USE_CP_ACP | CALTYPE_INVALID, lpCalData, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "Use CP ACP, CalType invalid", &NumErrors ); // // Buffer Too Small. // // Variation 1 - cchData = too small rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, 1, NULL ); CheckReturnBadParam( rc, 0, ERROR_INSUFFICIENT_BUFFER, "cchData too small", &NumErrors ); // // RETURN_NUMBER flag. // // Variation 1 - invalid flags rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_SCALNAME | CAL_RETURN_NUMBER, NULL, 0, &dwValue ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "invalid flags - RETURN_NUMBER", &NumErrors ); // Variation 2 - wrong buffer 1 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER, lpCalData, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "wrong buffer 1 - RETURN_NUMBER", &NumErrors ); // Variation 3 - wrong buffer 2 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER, lpCalData, 0, &dwValue ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "wrong buffer 2 - RETURN_NUMBER", &NumErrors ); // Variation 4 - wrong buffer 3 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER, NULL, BUFSIZE, &dwValue ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "wrong buffer 3 - RETURN_NUMBER", &NumErrors ); // // Wrong Buffer. // // Variation 1 - wrong buffer 1 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, &dwValue ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "wrong buffer 1", &NumErrors ); // Variation 2 - wrong buffer 2 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, NULL, 0, &dwValue ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "wrong buffer 2", &NumErrors ); // Variation 3 - wrong buffer 3 rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, 0, &dwValue ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "wrong buffer 3", &NumErrors ); // // Return total number of errors found. // return (NumErrors); } //////////////////////////////////////////////////////////////////////////// // // GCI_NormalCase // // This routine tests the normal cases of the API routine. // // 03-10-98 JulieB Created. //////////////////////////////////////////////////////////////////////////// int GCI_NormalCase() { DWORD dwValue; // value 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 = GetCalendarInfoW( LOCALE_SYSTEM_DEFAULT, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnEqual( rc, 0, "system default locale", &NumErrors ); // Variation 2 - Current User Locale rc = GetCalendarInfoW( LOCALE_USER_DEFAULT, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnEqual( rc, 0, "current user locale", &NumErrors ); // // Use CP ACP. // // Variation 1 - Use CP ACP, System Default Locale rc = GetCalendarInfoW( LOCALE_SYSTEM_DEFAULT, CAL_GREGORIAN, CAL_USE_CP_ACP | CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnEqual( rc, 0, "Use CP ACP, system default locale", &NumErrors ); // // cchData. // // Variation 1 - cchData = size of lpCalData buffer rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnValidW( rc, -1, lpCalData, S_ITWODIGITYEARMAX, "cchData = bufsize", &NumErrors ); // Variation 2 - cchData = 0 lpCalData[0] = 0x0000; rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, 0, NULL ); CheckReturnValidW( rc, -1, NULL, S_ITWODIGITYEARMAX, "cchData zero", &NumErrors ); // Variation 3 - cchData = 0, lpCalData = NULL rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, NULL, 0, NULL ); CheckReturnValidW( rc, -1, NULL, S_ITWODIGITYEARMAX, "cchData (NULL ptr)", &NumErrors ); // // CALTYPE values. // for (ctr = 0; ctr < NUM_CAL_FLAGS; ctr++) { rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, pCalInfoFlag[ctr], lpCalData, BUFSIZE, NULL ); CheckReturnValidLoopW( rc, -1, lpCalData, pCalString[ctr], "Calendar Flag", pCalInfoFlag[ctr], &NumErrors ); } for (ctr = 0; ctr < NUM_CAL_FLAGS; ctr++) { rc = GetCalendarInfoW( 0x0411, CAL_JAPAN, pCalInfoFlag[ctr], lpCalData, BUFSIZE, NULL ); CheckReturnValidLoopW( rc, -1, lpCalData, pCalStringJapan[ctr], "Japan Calendar Flag", pCalInfoFlag[ctr], &NumErrors ); } for (ctr = 0; ctr < NUM_CAL_FLAGS; ctr++) { rc = GetCalendarInfoW( 0x040d, CAL_HEBREW, pCalInfoFlag[ctr], lpCalData, BUFSIZE, NULL ); CheckReturnValidLoopW( rc, -1, lpCalData, pCalStringHebrew[ctr], "Hebrew Calendar Flag", pCalInfoFlag[ctr], &NumErrors ); } // // Language Neutral. // // Variation 1 - language neutral rc = GetCalendarInfoW( 0x0000, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnValidW( rc, -1, lpCalData, S_ITWODIGITYEARMAX, "language neutral", &NumErrors ); // Variation 2 - sys default rc = GetCalendarInfoW( 0x0400, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnValidW( rc, -1, lpCalData, S_ITWODIGITYEARMAX, "sys default", &NumErrors ); // Variation 3 - user default rc = GetCalendarInfoW( 0x0800, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnValidW( rc, -1, lpCalData, S_ITWODIGITYEARMAX, "user default", &NumErrors ); // Variation 4 - sub lang neutral US rc = GetCalendarInfoW( 0x0009, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, BUFSIZE, NULL ); CheckReturnValidW( rc, -1, lpCalData, S_ITWODIGITYEARMAX, "sub lang neutral US", &NumErrors ); // // Test Return Number flag. // // Variation 1 - RETURN_NUMBER rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER, NULL, 0, &dwValue ); CheckReturnValidInt( rc, 2, dwValue, 2029, "Return_Number - two digit year max", &NumErrors ); // // Try all INT flags with CAL_RETURN_NUMBER flag. // for (ctr = 0; ctr < NUM_CAL_INT_FLAGS; ctr++) { rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, pCalIntFlag[ctr] | CAL_RETURN_NUMBER, NULL, 0, &dwValue ); CheckReturnValidInt( rc, 2, dwValue, pCalInt[ctr], "Calendar Int Flag", &NumErrors ); } for (ctr = 0; ctr < NUM_CAL_INT_FLAGS; ctr++) { rc = GetCalendarInfoW( 0x0411, CAL_JAPAN, pCalIntFlag[ctr] | CAL_RETURN_NUMBER, NULL, 0, &dwValue ); CheckReturnValidInt( rc, 2, dwValue, pCalIntJapan[ctr], "Japan Calendar Int Flag", &NumErrors ); } // // Return total number of errors found. // return (NumErrors); } //////////////////////////////////////////////////////////////////////////// // // GCI_Ansi // // This routine tests the Ansi version of the API routine. // // 03-10-98 JulieB Created. //////////////////////////////////////////////////////////////////////////// int GCI_Ansi() { DWORD dwValue; // value int NumErrors = 0; // error count - to be returned int rc; // return code int ctr; // loop counter // // GetCalendarInfoA. // // Variation 1 - ITWODIGITYEARMAX rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalDataA, BUFSIZE, NULL ); CheckReturnValidA( rc, -1, lpCalDataA, "2029", NULL, "A version ITWODIGITYEARMAX", &NumErrors ); // Variation 2 - ITWODIGITYEARMAX rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, NULL, 0, NULL ); CheckReturnValidA( rc, -1, NULL, "2029", NULL, "A version ITWODIGITYEARMAX, no Dest", &NumErrors ); // Variation 3 - ITWODIGITYEARMAX rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, NULL, BUFSIZE, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "A version bad lpCalData", &NumErrors ); // // Use CP ACP. // // Variation 1 - Use CP ACP, ITWODIGITYEARMAX rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, CAL_USE_CP_ACP | CAL_ITWODIGITYEARMAX, lpCalDataA, BUFSIZE, NULL ); CheckReturnValidA( rc, -1, lpCalDataA, "2029", NULL, "A version Use CP ACP, ITWODIGITYEARMAX", &NumErrors ); // // Make sure the A and W versions set the same error value. // SetLastError( 0 ); rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalDataA, -1, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "A and W error returns same - A version", &NumErrors ); SetLastError( 0 ); rc = GetCalendarInfoW( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX, lpCalData, -1, NULL ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "A and W error returns same - W version", &NumErrors ); // // Test Return Number flag. // // Variation 1 - RETURN_NUMBER rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, CAL_ITWODIGITYEARMAX | CAL_RETURN_NUMBER, NULL, 0, &dwValue ); CheckReturnValidInt( rc, 4, dwValue, 2029, "A Version Return_Number - two digit year max", &NumErrors ); // // Try all INT flags with CAL_RETURN_NUMBER flag. // for (ctr = 0; ctr < NUM_CAL_INT_FLAGS; ctr++) { rc = GetCalendarInfoA( Locale, CAL_GREGORIAN, pCalIntFlag[ctr] | CAL_RETURN_NUMBER, NULL, 0, &dwValue ); CheckReturnValidInt( rc, 4, dwValue, pCalInt[ctr], "A Version Calendar Int Flag", &NumErrors ); } // // Return total number of errors found. // return (NumErrors); }