/*++ Copyright (c) 1991-1999, Microsoft Corporation All rights reserved. Module Name: nlstest.c Abstract: Test module for NLS API. 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" // // Global Variables. // BOOL Verbose = 0; // verbose flag LCID pAllLocales[] = // all supported locale ids { 0x0402, 0x0404, 0x0804, 0x0c04, 0x1004, 0x0405, 0x0406, 0x0407, 0x0807, 0x0c07, 0x0408, 0x0409, 0x0809, 0x0c09, 0x1009, 0x1409, 0x1809, 0x040a, 0x080a, 0x0c0a, 0x040b, 0x040c, 0x080c, 0x0c0c, 0x100c, 0x040e, 0x040f, 0x0410, 0x0810, 0x0411, 0x0412, 0x0413, 0x0813, 0x0414, 0x0814, 0x0415, 0x0416, 0x0816, 0x0418, 0x0419, 0x041a, 0x041b, 0x041d, 0x041f, 0x0424 }; int NumLocales = ( sizeof(pAllLocales) / sizeof(LCID) ); // Buffer used in GetUnicodeString()/GetAnsiString() CHAR TempStringBuffer[1024]; //////////////////////////////////////////////////////////////////////////// // // main // // Main Routine. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// int _cdecl main( int argc, char *argv[]) { int NumErrs = 0; // number of errors // // Check for verbose switch. // if ( (argc > 1) && (_stricmp(argv[1], "-v") == 0) ) { Verbose = 1; } // // Print out what's being done. // printf("\nTesting NLS Component.\n"); // // Test MultiByteToWideChar. // NumErrs += TestMBToWC(); // // Test WideCharToMultiByte. // NumErrs += TestWCToMB(); // // Test GetCPInfo. // NumErrs += TestGetCPInfo(); // // Test CompareString. // NumErrs += TestCompareString(); // // Test GetStringType. // NumErrs += TestGetStringType(); // // Test FoldString. // NumErrs += TestFoldString(); // // Test LCMapString. // NumErrs += TestLCMapString(); // // Test GetLocaleInfo. // NumErrs += TestGetLocaleInfo(); // // Test SetLocaleInfo. // NumErrs += TestSetLocaleInfo(); // // Test GetCalendarInfo. // NumErrs += TestGetCalendarInfo(); // // Test SetCalendarInfo. // NumErrs += TestSetCalendarInfo(); // // Test GetGeoInfo. // NumErrs += TestGetGeoInfo(); // // Test GetTimeFormat. // NumErrs += TestGetTimeFormat(); // // Test GetDateFormat. // NumErrs += TestGetDateFormat(); // // Test GetNumberFormat. // NumErrs += TestGetNumberFormat(); // // Test GetCurrencyFormat. // NumErrs += TestGetCurrencyFormat(); // // Test IsDBCSLeadByte. // NumErrs += TestIsDBCSLeadByte(); // // Test IsValidCodePage. // NumErrs += TestIsValidCodePage(); // // Test IsValidLanguageGroup. // NumErrs += TestIsValidLanguageGroup(); // // Test IsValidLocale. // NumErrs += TestIsValidLocale(); // // Test GetACP, GetOEMCP, // GetSystemDefaultUILanguage, GetUserDefaultUILanguage, // GetSystemDefaultLangID, GetUserDefaultLangID, // GetSystemDefaultLCID, GetUserDefaultLCID, // GetThreadLocale, SetThreadLocale // NumErrs += TestUtilityAPIs(); // // Test EnumUILanguages. // NumErrs += TestEnumUILanguages(); // // Test EnumSystemLanguageGroups. // NumErrs += TestEnumSystemLanguageGroups(); // // Test EnumLanguageGroupLocales. // NumErrs += TestEnumLanguageGroupLocales(); // // Test EnumSystemLocales. // NumErrs += TestEnumSystemLocales(); // // Test EnumSystemCodePages. // NumErrs += TestEnumSystemCodePages(); // // Test EnumCalendarInfo. // NumErrs += TestEnumCalendarInfo(); // // Test EnumTimeFormats. // NumErrs += TestEnumTimeFormats(); // // Test EnumDateFormats. // NumErrs += TestEnumDateFormats(); // // Test EnumSystemGeoID. // NumErrs += TestEnumSystemGeoID(); // // Print out final result. // if (NumErrs == 0) printf("\n\n\nNO Errors Found.\n\n"); else printf("\n\n\n%d ERRORS FOUND.\n\n", NumErrs); // // Return number of errors found. // return (NumErrs); argc; argv; } //////////////////////////////////////////////////////////////////////////// // // CompStringsW // // Compares a wide character string to another wide character string. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// int CompStringsW( WCHAR *WCStr1, WCHAR *WCStr2, int size) { int ctr; // loop counter for (ctr = 0; WCStr1[ctr] == WCStr2[ctr]; ctr++) { if (ctr == (size - 1)) return (0); } return (1); } //////////////////////////////////////////////////////////////////////////// // // CompStringsA // // Compares a multibyte string to another multibyte character string. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// int CompStringsA( BYTE *MBStr1, BYTE *MBStr2, int size) { int ctr; // loop counter for (ctr = 0; MBStr1[ctr] == MBStr2[ctr]; ctr++) { if (ctr == (size - 1)) return (0); } return (1); } //////////////////////////////////////////////////////////////////////////// // // PrintWC // // Prints out a wide character string to the screen. // Need the size parameter because the string may not be zero terminated. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void PrintWC( WCHAR *WCStr, int size) { int ctr; // loop counter // // Print the wide character string. // printf(" WC String => [%s]\n", GetUnicodeString(WCStr, size)); } //////////////////////////////////////////////////////////////////////////// // // PrintMB // // Prints out a multibyte character string to the screen. // Need the size parameter because the string may not be zero terminated. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void PrintMB( BYTE *MBStr, int size) { int ctr; // loop counter // // Print the multibyte character string. // printf(" MB String => ["); for (ctr = 0; ctr < size; ctr++) { printf(((MBStr[ctr] < 0x21) || (MBStr[ctr] > 0x7e)) ? "(0x%x)" : "%c", MBStr[ctr]); } printf("]\n"); } LPSTR GetUnicodeString(LPWSTR wstr, int count) { int i; LPSTR lpResult = TempStringBuffer; if (count == -1) { count = wcslen(wstr) + 1; } for (i = 0; i < count; i++) { lpResult += sprintf(lpResult, "\\x%04x", (int)wstr[i]); } lpResult = L'\0'; return (TempStringBuffer); } LPSTR GetAnsiString(LPSTR str, int count) { int i; LPSTR lpResult = TempStringBuffer; if (count == -1) { count = strlen(str); } for (i = 0; i < count; i++) { lpResult += sprintf(lpResult, "\\x%02x", (unsigned char)str[i]); } lpResult = L'\0'; return (TempStringBuffer); } //////////////////////////////////////////////////////////////////////////// // // CheckLastError // // Checks the last error value. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckLastError( DWORD ExpectedLastError, LPSTR pErrString, int *pNumErrors) { DWORD CurrentLastError; // last error WCHAR Buffer[512]; if ((CurrentLastError = GetLastError()) != ExpectedLastError) { printf(">>>>ERROR: %s - \n", pErrString); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, CurrentLastError, 0, Buffer, 512, NULL); wprintf(L" LastError = %x, String: %s\n", CurrentLastError, Buffer); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ExpectedLastError, 0, Buffer, 512, NULL); wprintf(L" Expected = %x, String: %s\n", ExpectedLastError, Buffer); (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnBadParam // // Checks the return code from a call with a bad parameter. It prints out // the appropriate error if either the return code or the last error is // incorrect. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnBadParam( int CurrentReturn, int ExpectedReturn, DWORD ExpectedLastError, LPSTR pErrString, int *pNumErrors) { DWORD CurrentLastError; // last error if ( (CurrentReturn != ExpectedReturn) || ((CurrentLastError = GetLastError()) != ExpectedLastError) ) { printf("ERROR: %s - \n", pErrString); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); printf(" LastError = %d, Expected = %d\n", CurrentLastError, ExpectedLastError); (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnBadParamEnum // // Checks the return code from an enumeration call with a bad parameter. // It prints out the appropriate error if either the return code, the last // error, or the enumeration counter is incorrect. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnBadParamEnum( int CurrentReturn, int ExpectedReturn, DWORD ExpectedLastError, LPSTR pErrString, int *pNumErrors, int CurrentEnumCtr, int ExpectedEnumCtr) { DWORD CurrentLastError; // last error if ( (CurrentReturn != ExpectedReturn) || ((CurrentLastError = GetLastError()) != ExpectedLastError) || (CurrentEnumCtr != ExpectedEnumCtr) ) { printf("ERROR: %s - \n", pErrString); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); printf(" LastError = %d, Expected = %d\n", CurrentLastError, ExpectedLastError); printf(" EnumCtr = %d, Expected = %d\n", CurrentEnumCtr, ExpectedEnumCtr); (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnEqual // // Checks the return code from the valid NLS api "A" call to be sure that // it does NOT equal a particular value. If it does equal that value, // then it prints out the appropriate error. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnEqual( int CurrentReturn, int NonExpectedReturn, LPSTR pErrString, int *pNumErrors) { if (CurrentReturn == NonExpectedReturn) { printf("ERROR: %s - \n", pErrString); printf(" Unexpected Return = %d\n", CurrentReturn); printf(" Last Error = %d\n", GetLastError()); (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidEnumLoop // // Checks the return code from the valid NLS api "Enum" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidEnumLoop( int CurrentReturn, int ExpectedReturn, int CurrentCtr, int ExpectedCtr, LPSTR pErrString, DWORD ItemValue, int *pNumErrors) { if ( (CurrentReturn != ExpectedReturn) || (CurrentCtr != ExpectedCtr) ) { printf("ERROR: %s %x - \n", pErrString, ItemValue); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); printf(" Counter = %d, Expected = %d\n", CurrentCtr, ExpectedCtr); (*pNumErrors)++; } if (Verbose) { printf("\n"); } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidEnum // // Checks the return code from the valid NLS api "Enum" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidEnum( int CurrentReturn, int ExpectedReturn, int CurrentCtr, int ExpectedCtr, LPSTR pErrString, int *pNumErrors) { if ( (CurrentReturn != ExpectedReturn) || (CurrentCtr != ExpectedCtr) ) { printf("ERROR: %s - \n", pErrString); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); printf(" Counter = %d, Expected = %d\n", CurrentCtr, ExpectedCtr); (*pNumErrors)++; } if (Verbose) { printf("\n"); } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidLoopW // // Checks the return code from the valid NLS api "W" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidLoopW( int CurrentReturn, int ExpectedReturn, LPWSTR pCurrentString, LPWSTR pExpectedString, LPSTR pErrString, DWORD ItemValue, int *pNumErrors) { if ((ExpectedReturn == -1) && (pExpectedString != NULL)) { ExpectedReturn = WC_STRING_LEN_NULL(pExpectedString); } if ( (CurrentReturn != ExpectedReturn) || ( (pCurrentString != NULL) && (CompStringsW(pCurrentString, pExpectedString, CurrentReturn)) ) ) { printf("ERROR: %s %x - \n", pErrString, ItemValue); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); if (pCurrentString != NULL) { PrintWC(pCurrentString, CurrentReturn); } (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidLoopA // // Checks the return code from the valid NLS api "A" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidLoopA( int CurrentReturn, int ExpectedReturn, LPSTR pCurrentString, LPSTR pExpectedString, LPSTR pErrString, DWORD ItemValue, int *pNumErrors) { if ((ExpectedReturn == -1) && (pExpectedString != NULL)) { ExpectedReturn = MB_STRING_LEN_NULL(pExpectedString); } if ( (CurrentReturn != ExpectedReturn) || ( (pCurrentString != NULL) && (CompStringsA(pCurrentString, pExpectedString, CurrentReturn)) ) ) { printf("ERROR: %s %x - \n", pErrString, ItemValue); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); if (pCurrentString != NULL) { PrintMB(pCurrentString, CurrentReturn); } (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidW // // Checks the return code from the valid NLS api "W" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidW( int CurrentReturn, int ExpectedReturn, LPWSTR pCurrentString, LPWSTR pExpectedString, LPSTR pErrString, int *pNumErrors) { if ((ExpectedReturn == -1) && (pExpectedString != NULL)) { ExpectedReturn = WC_STRING_LEN_NULL(pExpectedString); } if ( (CurrentReturn != ExpectedReturn) || ( (pCurrentString != NULL) && (CompStringsW(pCurrentString, pExpectedString, CurrentReturn)) ) ) { printf(">>>>ERROR: %s - \n", pErrString); printf(" Return = %d\n", CurrentReturn); printf(" Expected = %d\n", ExpectedReturn); if (pCurrentString != NULL) { PrintWC(pCurrentString, CurrentReturn); } (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidA // // Checks the return code from the valid NLS api "A" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidA( int CurrentReturn, int ExpectedReturn, LPSTR pCurrentString, LPSTR pExpectedString, LPBOOL pUsedDef, LPSTR pErrString, int *pNumErrors) { if ((ExpectedReturn == -1) && (pExpectedString != NULL)) { ExpectedReturn = MB_STRING_LEN_NULL(pExpectedString); } if ( (CurrentReturn != ExpectedReturn) || ( (pCurrentString != NULL) && (CompStringsA(pCurrentString, pExpectedString, CurrentReturn)) ) || ( (pUsedDef != NULL) && (*pUsedDef != TRUE) ) ) { printf("ERROR: %s - \n", pErrString); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); if (pUsedDef != NULL) { printf(" UsedDef = %d\n", *pUsedDef); } if (pCurrentString != NULL) { PrintMB(pCurrentString, CurrentReturn); } (*pNumErrors)++; } } //////////////////////////////////////////////////////////////////////////// // // CheckReturnValidInt // // Checks the return code from the valid NLS api "W" call. It prints out // the appropriate error if the incorrect result is found. // // 06-14-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// void CheckReturnValidInt( int CurrentReturn, int ExpectedReturn, DWORD CurrentInt, DWORD ExpectedInt, LPSTR pErrString, int *pNumErrors) { if ( (CurrentReturn != ExpectedReturn) || (CurrentInt != ExpectedInt) ) { printf("ERROR: %s - \n", pErrString); printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn); printf(" Return Int = %d, Expected Int = %d\n", CurrentInt, ExpectedInt); (*pNumErrors)++; } }