windows-nt/Source/XPSP1/NT/base/win32/winnls/test/nlstest/cpitest.c

954 lines
22 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991-1999, Microsoft Corporation All rights reserved.
Module Name:
cpitest.c
Abstract:
Test module for NLS API GetCPInfo.
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"
//
// Constant Definitions.
//
#define CPI_UNICODE 1
#define CPI_ANSI 2
//
// Forward Declarations.
//
int
CPI_BadParamCheck();
int
CPI_NormalCase();
BOOL
CheckInfoStruct(
LPCPINFO pInfo,
UINT MaxCharSize,
DWORD fExVer);
BOOL
CheckDBCSInfoStruct(
LPCPINFO pInfo,
DWORD fExVer);
void
PrintInfoStruct(
LPCPINFO pInfo,
DWORD fExVer);
void
CheckReturnCPInfo(
int CurrentReturn,
LPCPINFO pCurrentInfo,
BOOL fIfDBCSInfo,
UINT MaxCharSize,
LPSTR pErrString,
DWORD fExVer,
int *pNumErrors);
////////////////////////////////////////////////////////////////////////////
//
// TestGetCPInfo
//
// Test routine for GetCPInfo API.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int TestGetCPInfo()
{
int ErrCount = 0; // error count
//
// Print out what's being done.
//
printf("\n\nTESTING GetCPInfo...\n\n");
//
// Test bad parameters.
//
ErrCount += CPI_BadParamCheck();
//
// Test normal cases.
//
ErrCount += CPI_NormalCase();
//
// Print out result.
//
printf("\nGetCPInfo: ERRORS = %d\n", ErrCount);
//
// Return total number of errors found.
//
return (ErrCount);
}
////////////////////////////////////////////////////////////////////////////
//
// CPI_BadParamCheck
//
// This routine passes in bad parameters to the API routine and checks to
// be sure they are handled properly. The number of errors encountered
// is returned to the caller.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int CPI_BadParamCheck()
{
int NumErrors = 0; // error count - to be returned
BOOL rc; // return code
CPINFO Info; // CPINFO structure
CPINFOEXW InfoEx; // CPINFOEXW structure
CPINFOEXA InfoExA; // CPINFOEXA structure
//
// Null Pointers.
//
// Variation 1 - lpCPInfo = NULL
rc = GetCPInfo( 1252,
NULL );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_PARAMETER,
"lpCPInfo NULL",
&NumErrors );
//
// Invalid Code Page.
//
// Variation 1 - CodePage = invalid
rc = GetCPInfo( 5,
&Info );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_PARAMETER,
"CodePage Invalid",
&NumErrors );
//
// EX Version - Null Pointers.
//
// Variation 1 - lpCPInfo = NULL
rc = GetCPInfoExW( 1252,
0,
NULL );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_PARAMETER,
"Ex lpCPInfo NULL",
&NumErrors );
rc = GetCPInfoExA( 1252,
0,
NULL );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_PARAMETER,
"A version Ex lpCPInfo NULL",
&NumErrors );
//
// EX Version - Invalid Code Page.
//
// Variation 1 - CodePage = invalid
rc = GetCPInfoExW( 5,
0,
&InfoEx );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_PARAMETER,
"CodePage Invalid",
&NumErrors );
rc = GetCPInfoExA( 5,
0,
&InfoExA );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_PARAMETER,
"A version CodePage Invalid",
&NumErrors );
//
// EX Version - Invalid Flags.
//
// Variation 1 - Flags = invalid
rc = GetCPInfoExW( 1252,
1,
&InfoEx );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_FLAGS,
"Flags Invalid",
&NumErrors );
rc = GetCPInfoExA( 1252,
1,
&InfoExA );
CheckReturnBadParam( rc,
FALSE,
ERROR_INVALID_FLAGS,
"A version Flags Invalid",
&NumErrors );
//
// Return total number of errors found.
//
return (NumErrors);
}
////////////////////////////////////////////////////////////////////////////
//
// CPI_NormalCase
//
// This routine tests the normal cases of the API routine.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int CPI_NormalCase()
{
int NumErrors = 0; // error count - to be returned
int rc; // return code
CPINFO Info; // CPINFO structure
CPINFOEXW InfoEx; // CPINFOEXW structure
CPINFOEXA InfoExA; // CPINFOEXA structure
#ifdef PERF
DbgBreakPoint();
#endif
//
// CodePage defaults.
//
// Variation 1 - CodePage = CP_ACP
rc = GetCPInfo( CP_ACP,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
1,
"CodePage CP_ACP",
0,
&NumErrors );
// Variation 2 - CodePage = CP_OEMCP
rc = GetCPInfo( CP_OEMCP,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
1,
"CodePage CP_OEMCP",
0,
&NumErrors );
//
// CodePage 1252.
//
// Variation 1 - CodePage = 1252
rc = GetCPInfo( 1252,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
1,
"CodePage 1252",
0,
&NumErrors );
//
// CodePage 437.
//
// Variation 1 - CodePage = 437
rc = GetCPInfo( 437,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
1,
"CodePage 437",
0,
&NumErrors );
//
// CodePage 850.
//
// Variation 1 - CodePage = 850
rc = GetCPInfo( 850,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
1,
"CodePage 850",
0,
&NumErrors );
//
// CodePage 10000.
//
// Variation 1 - CodePage = 10000
rc = GetCPInfo( 10000,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
1,
"CodePage 10000",
0,
&NumErrors );
//
// CodePage 932.
//
// Variation 1 - CodePage = 932
rc = GetCPInfo( 932,
&Info );
CheckReturnCPInfo( rc,
&Info,
TRUE,
2,
"CodePage 932",
0,
&NumErrors );
//
// CodePage UTF 7.
//
// Variation 1 - CodePage = UTF 7
rc = GetCPInfo( CP_UTF7,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
5,
"CodePage UTF 7",
0,
&NumErrors );
//
// CodePage UTF 8.
//
// Variation 1 - CodePage = UTF 8
rc = GetCPInfo( CP_UTF8,
&Info );
CheckReturnCPInfo( rc,
&Info,
FALSE,
4,
"CodePage UTF 8",
0,
&NumErrors );
// -------------------------------------------------------------
//
// Ex CodePage defaults.
//
// Variation 1 - CodePage = CP_ACP
rc = GetCPInfoExW( CP_ACP,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
1,
"CodePage CP_ACP",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( CP_ACP,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
1,
"A version CodePage CP_ACP",
CPI_ANSI,
&NumErrors );
// Variation 2 - CodePage = CP_OEMCP
rc = GetCPInfoExW( CP_OEMCP,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
1,
"CodePage CP_OEMCP",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( CP_OEMCP,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
1,
"A version CodePage CP_OEMCP",
CPI_ANSI,
&NumErrors );
//
// CodePage 1252.
//
// Variation 1 - CodePage = 1252
rc = GetCPInfoExW( 1252,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
1,
"CodePage 1252",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( 1252,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
1,
"A version CodePage 1252",
CPI_ANSI,
&NumErrors );
//
// CodePage 437.
//
// Variation 1 - CodePage = 437
rc = GetCPInfoExW( 437,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
1,
"CodePage 437",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( 437,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
1,
"A version CodePage 437",
CPI_ANSI,
&NumErrors );
//
// CodePage 850.
//
// Variation 1 - CodePage = 850
rc = GetCPInfoExW( 850,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
1,
"CodePage 850",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( 850,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
1,
"A version CodePage 850",
CPI_ANSI,
&NumErrors );
//
// CodePage 10000.
//
// Variation 1 - CodePage = 10000
rc = GetCPInfoExW( 10000,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
1,
"CodePage 10000",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( 10000,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
1,
"A version CodePage 10000",
CPI_ANSI,
&NumErrors );
//
// CodePage 932.
//
// Variation 1 - CodePage = 932
rc = GetCPInfoExW( 932,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
TRUE,
2,
"CodePage 932",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( 932,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
TRUE,
2,
"A version CodePage 932",
CPI_ANSI,
&NumErrors );
//
// CodePage UTF 7.
//
// Variation 1 - CodePage = UTF 7
rc = GetCPInfoExW( CP_UTF7,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
5,
"CodePage UTF 7",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( CP_UTF7,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
5,
"A version CodePage UTF 7",
CPI_ANSI,
&NumErrors );
//
// CodePage UTF 8.
//
// Variation 1 - CodePage = UTF 8
rc = GetCPInfoExW( CP_UTF8,
0,
&InfoEx );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoEx,
FALSE,
4,
"CodePage UTF 8",
CPI_UNICODE,
&NumErrors );
rc = GetCPInfoExA( CP_UTF8,
0,
&InfoExA );
CheckReturnCPInfo( rc,
(LPCPINFO)&InfoExA,
FALSE,
4,
"A version CodePage UTF 8",
CPI_ANSI,
&NumErrors );
//
// Return total number of errors found.
//
return (NumErrors);
}
////////////////////////////////////////////////////////////////////////////
//
// CheckInfoStruct
//
// This routine checks the CPINFO structure to be sure the values are
// consistent with code page 1252.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
BOOL CheckInfoStruct(
LPCPINFO pInfo,
UINT MaxCharSize,
DWORD fExVer)
{
int ctr; // loop counter
//
// Check MaxCharSize field.
//
if (pInfo->MaxCharSize != MaxCharSize)
{
printf("ERROR: MaxCharSize = %x\n", pInfo->MaxCharSize);
return (FALSE);
}
//
// Check DefaultChar field.
//
if (((pInfo->DefaultChar)[0] != (BYTE)0x3f) &&
((pInfo->DefaultChar)[1] != (BYTE)0))
{
printf("ERROR: DefaultChar = '%s'\n", pInfo->DefaultChar);
return (FALSE);
}
//
// Check LeadByte field.
//
for (ctr = 0; ctr < MAX_LEADBYTES; ctr++)
{
if (pInfo->LeadByte[ctr] != 0)
{
printf("ERROR: LeadByte not 0 - ctr = %x\n", ctr);
return (FALSE);
}
}
//
// See if Ex version.
//
if (fExVer)
{
if (fExVer == CPI_ANSI)
{
LPCPINFOEXA pInfoA = (LPCPINFOEXA)pInfo;
//
// Check UnicodeDefaultChar field.
//
if (pInfoA->UnicodeDefaultChar != L'?')
{
printf("ERROR: UnicodeDefaultChar = '%x'\n", pInfoA->UnicodeDefaultChar);
return (FALSE);
}
}
else if (fExVer == CPI_UNICODE)
{
LPCPINFOEXW pInfoW = (LPCPINFOEXW)pInfo;
//
// Check UnicodeDefaultChar field.
//
if (pInfoW->UnicodeDefaultChar != L'?')
{
printf("ERROR: UnicodeDefaultChar = '%x'\n", pInfoW->UnicodeDefaultChar);
return (FALSE);
}
}
}
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// CheckDBCSInfoStruct
//
// This routine checks the CPINFO structure to be sure the values are
// consistent with code page 932.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
BOOL CheckDBCSInfoStruct(
LPCPINFO pInfo,
DWORD fExVer)
{
int ctr; // loop counter
//
// Check MaxCharSize field.
//
if (pInfo->MaxCharSize != 2)
{
printf("ERROR: MaxCharSize = %x\n", pInfo->MaxCharSize);
return (FALSE);
}
//
// Check DefaultChar field.
//
if ((pInfo->DefaultChar)[0] != (BYTE)0x3f)
{
printf("ERROR: DefaultChar = '%s'\n", pInfo->DefaultChar);
return (FALSE);
}
//
// Check LeadByte field.
//
if ( ((pInfo->LeadByte)[0] != 0x81) ||
((pInfo->LeadByte)[1] != 0x9f) ||
((pInfo->LeadByte)[2] != 0xe0) ||
((pInfo->LeadByte)[3] != 0xfc) )
{
printf("ERROR: LeadByte not correct\n");
return (FALSE);
}
for (ctr = 4; ctr < MAX_LEADBYTES; ctr++)
{
if (pInfo->LeadByte[ctr] != 0)
{
printf("ERROR: LeadByte not 0 - ctr = %x\n", ctr);
return (FALSE);
}
}
//
// See if Ex version.
//
if (fExVer)
{
if (fExVer == CPI_ANSI)
{
LPCPINFOEXA pInfoA = (LPCPINFOEXA)pInfo;
//
// Check UnicodeDefaultChar field.
//
if (pInfoA->UnicodeDefaultChar != 0x30fb)
{
printf("ERROR: UnicodeDefaultChar = '%x'\n", pInfoA->UnicodeDefaultChar);
return (FALSE);
}
}
else if (fExVer == CPI_UNICODE)
{
LPCPINFOEXW pInfoW = (LPCPINFOEXW)pInfo;
//
// Check UnicodeDefaultChar field.
//
if (pInfoW->UnicodeDefaultChar != 0x30fb)
{
printf("ERROR: UnicodeDefaultChar = '%x'\n", pInfoW->UnicodeDefaultChar);
return (FALSE);
}
}
}
//
// Return success.
//
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// PrintInfoStruct
//
// This routine prints out the CPINFO structure.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
void PrintInfoStruct(
LPCPINFO pInfo,
DWORD fExVer)
{
int ctr; // loop counter
//
// Print out MaxCharSize field.
//
printf(" MaxCharSize = %x\n", pInfo->MaxCharSize);
//
// Print out DefaultChar field.
//
printf(" DefaultChar = %x %x\n",
(pInfo->DefaultChar)[0], (pInfo->DefaultChar)[1] );
//
// Print out LeadByte field.
//
for (ctr = 0; ctr < MAX_LEADBYTES; ctr += 2)
{
printf(" LeadByte = %x %x\n",
pInfo->LeadByte[ctr], pInfo->LeadByte[ctr + 1]);
}
//
// See if we have the Ex version.
//
if (fExVer)
{
if (fExVer == CPI_ANSI)
{
LPCPINFOEXA pInfoA = (LPCPINFOEXA)pInfo;
printf(" UnicodeDefaultChar = %x\n", pInfoA->UnicodeDefaultChar);
printf(" CodePage = %d\n", pInfoA->CodePage);
printf(" CodePageName = %s\n", pInfoA->CodePageName);
}
else if (fExVer == CPI_UNICODE)
{
LPCPINFOEXW pInfoW = (LPCPINFOEXW)pInfo;
printf(" UnicodeDefaultChar = %x\n", pInfoW->UnicodeDefaultChar);
printf(" CodePage = %d\n", pInfoW->CodePage);
printf(" CodePageName = %ws\n", pInfoW->CodePageName);
}
}
}
////////////////////////////////////////////////////////////////////////////
//
// CheckReturnCPInfo
//
// Checks the return code from the GetCPInfo call. It prints out
// the appropriate error if the incorrect result is found.
//
// 06-14-91 JulieB Created.
////////////////////////////////////////////////////////////////////////////
void CheckReturnCPInfo(
int CurrentReturn,
LPCPINFO pCurrentInfo,
BOOL fIfDBCSInfo,
UINT MaxCharSize,
LPSTR pErrString,
DWORD fExVer,
int *pNumErrors)
{
if ( (CurrentReturn == FALSE) ||
( (fIfDBCSInfo == FALSE)
? (!CheckInfoStruct(pCurrentInfo, MaxCharSize, fExVer))
: (!CheckDBCSInfoStruct(pCurrentInfo, fExVer)) ) )
{
printf("ERROR: %s - \n", pErrString);
printf(" Return = %d, Expected = 0\n", CurrentReturn);
printf(" LastError = %d, Expected = 0\n", GetLastError());
PrintInfoStruct(pCurrentInfo, fExVer);
(*pNumErrors)++;
}
else if (Verbose)
{
PrintInfoStruct(pCurrentInfo, fExVer);
}
}