Windows2000/private/windows/winnls/test/nlstest/gsttest.c
2020-09-30 17:12:32 +02:00

946 lines
23 KiB
C

/*++
Copyright (c) 1991-1999, Microsoft Corporation All rights reserved.
Module Name:
gsttest.c
Abstract:
Test module for NLS API GetStringType.
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 Declarations.
#define BUFSIZE 50
#define GST_INVALID_FLAGS ((DWORD)(~(CT_CTYPE1 | CT_CTYPE2 | CT_CTYPE3)))
#define CT1_LOCASE_LETTER L"\x0102\x0102"
#define CT1_UPCASE_LETTER L"\x0101\x0101"
#ifdef JDB
// JDB - Fix to get around C compiler bug - it tries to translate
// from Unicode to Ansi
#define CT1_NUMBER L"\x0084\x0084"
#else
// JDB - Fix to get around C compiler bug.
WCHAR CT1_NUMBER[] = {0x0084, 0x0084, 0x0000};
#endif
#define CT1_PUNCTUATION L"\x0010\x0010"
#define CT2_LOCASE_LETTER L"\x0001\x0001"
#define CT2_UPCASE_LETTER L"\x0001\x0001"
#define CT2_NUMBER L"\x0003\x0003"
#define CT2_PUNCTUATION L"\x000b\x000b"
#define CT3_VALUE L"\x8040\x8040"
#define CT3_SYMBOL L"\x0048\x0048"
// Global Variables.
#define pGSTSrcLower L"th"
#define pGSTSrcUpper L"TH"
#define pGSTSrcNumber L"12"
#define pGSTSrcPunct L";?"
WORD pCharType[BUFSIZE * 2];
// Forward Declarations.
BOOL
InitGetStringType();
int
GST_BadParamCheck();
int
GST_NormalCase();
int
GST_Ansi();
void
CheckReturnGetStringType(
int CurrentReturn,
int ExpectedReturn,
LPWSTR pCurrentString,
LPWSTR pExpectedString,
int ExpectedSize,
LPSTR pErrString,
int* pNumErrors);
// TestGetStringType
// Test routine for GetStringTypeW API.
// 06-14-91 JulieB Created.
int TestGetStringType()
{
int ErrCount = 0; // error count
// Print out what's being done.
printf("\n\nTESTING GetStringTypeW...\n\n");
// Initialize global variables.
if (!InitGetStringType()) {
printf("\nABORTED TestGetStringType: Could not Initialize.\n");
return (1);
}
// Test bad parameters.
ErrCount += GST_BadParamCheck();
// Test normal cases.
ErrCount += GST_NormalCase();
// Test Ansi version.
ErrCount += GST_Ansi();
// Print out result.
printf("\nGetStringTypeW: ERRORS = %d\n", ErrCount);
// Return total number of errors found.
return (ErrCount);
}
// InitGetStringType
// This routine initializes the global variables. If no errors were
// encountered, then it returns TRUE. Otherwise, it returns FALSE.
// 06-14-91 JulieB Created.
BOOL InitGetStringType()
{
// Return success.
return (TRUE);
}
// GST_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 GST_BadParamCheck()
{
int NumErrors = 0; // error count - to be returned
BOOL rc; // return code
// Null Pointers.
// Variation 1 - lpSrcStr = NULL
rc = GetStringTypeW(CT_CTYPE1,
NULL,
-1,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_PARAMETER,
"lpSrcStr NULL",
&NumErrors);
// Variation 2 - lpCharType = NULL
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcUpper,
-1,
NULL);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_PARAMETER,
"lpCharType NULL",
&NumErrors);
// Bad Counts.
// Variation 1 - cbSrc = 0
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcUpper,
0,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_PARAMETER,
"cbSrc = 0",
&NumErrors);
// Zero or Invalid Flag Values.
// Variation 1 - dwInfoType = invalid
rc = GetStringTypeW(GST_INVALID_FLAGS,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_FLAGS,
"dwInfoType invalid",
&NumErrors);
// Variation 2 - dwInfoType = 0
rc = GetStringTypeW(0,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_FLAGS,
"dwInfoType zero",
&NumErrors);
// Variation 3 - illegal combo case 1,2
rc = GetStringTypeW(CT_CTYPE1 | CT_CTYPE2,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_FLAGS,
"illegal combo case 1,2",
&NumErrors);
// Variation 4 - illegal combo case 1,3
rc = GetStringTypeW(CT_CTYPE1 | CT_CTYPE3,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_FLAGS,
"illegal combo case 1,3",
&NumErrors);
// Variation 5 - illegal combo case 2,3
rc = GetStringTypeW(CT_CTYPE2 | CT_CTYPE3,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnBadParam(rc,
FALSE,
ERROR_INVALID_FLAGS,
"illegal combo case 2,3",
&NumErrors);
// Return total number of errors found.
return (NumErrors);
}
// GST_NormalCase
// This routine tests the normal cases of the API routine.
// 06-14-91 JulieB Created.
int GST_NormalCase()
{
int NumErrors = 0; // error count - to be returned
int rc; // return code
#ifdef PERF
DbgBreakPoint();
#endif
// GetStringTypeW
// cbSrc.
// Variation 1 - cbSrc = -1
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnEqual(rc,
FALSE,
"cbSrc (-1)",
&NumErrors);
// Variation 2 - cbSrc = value
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcUpper,
WC_STRING_LEN(pGSTSrcUpper),
pCharType);
CheckReturnEqual(rc,
FALSE,
"cbSrc (value)",
&NumErrors);
// CTYPE 1.
// Variation 1 - ctype1, lower
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcLower,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_LOCASE_LETTER,
2,
"ctype1, lower",
&NumErrors);
// Variation 2 - ctype1, upper case letter
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_UPCASE_LETTER,
2,
"ctype1, upper",
&NumErrors);
// Variation 3 - ctype1, number
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcNumber,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_NUMBER,
2,
"ctype1, number",
&NumErrors);
// Variation 4 - ctype1, punctuation
rc = GetStringTypeW(CT_CTYPE1,
pGSTSrcPunct,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_PUNCTUATION,
2,
"ctype1, punctuation",
&NumErrors);
// Variation 5 - ctype 1
rc = GetStringTypeW(CT_CTYPE1,
L"\xff53",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0102\x0020",
2,
"ctype1 (0xff53)",
&NumErrors);
// CTYPE 2.
// Variation 1 - ctype2, lower
rc = GetStringTypeW(CT_CTYPE2,
pGSTSrcLower,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT2_LOCASE_LETTER,
2,
"ctype2, lower",
&NumErrors);
// Variation 2 - ctype2, upper case letter
rc = GetStringTypeW(CT_CTYPE2,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT2_UPCASE_LETTER,
2,
"ctype2, upper",
&NumErrors);
// Variation 3 - ctype2, number
rc = GetStringTypeW(CT_CTYPE2,
pGSTSrcNumber,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT2_NUMBER,
2,
"ctype2, number",
&NumErrors);
// Variation 4 - ctype2, punctuation
rc = GetStringTypeW(CT_CTYPE2,
pGSTSrcPunct,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT2_PUNCTUATION,
2,
"ctype2, punctuation",
&NumErrors);
// Variation 5 - ctype 2
rc = GetStringTypeW(CT_CTYPE2,
L"\xff53",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0001\x0000",
2,
"ctype2 (0xff53)",
&NumErrors);
// CTYPE 3.
// Variation 1 - ctype 3 should return zeros
rc = GetStringTypeW(CT_CTYPE3,
pGSTSrcLower,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT3_VALUE,
2,
"ctype3 zero",
&NumErrors);
// Variation 2 - ctype 3 symbol
rc = GetStringTypeW(CT_CTYPE3,
pGSTSrcPunct,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT3_SYMBOL,
2,
"ctype3 symbol",
&NumErrors);
// Variation 3 - ctype 3
rc = GetStringTypeW(CT_CTYPE3,
L"\xff53",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x8080\x0000",
2,
"ctype3 (0xff53)",
&NumErrors);
// GetStringTypeExW
// cbSrc.
// Variation 1 - cbSrc = -1
rc = GetStringTypeExW(0x0409,
CT_CTYPE1,
pGSTSrcUpper,
-1,
pCharType);
CheckReturnEqual(rc,
FALSE,
"Ex cbSrc (-1)",
&NumErrors);
// CTYPE 1.
// Variation 1 - ctype1, lower
rc = GetStringTypeExW(0x0409,
CT_CTYPE1,
pGSTSrcLower,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_LOCASE_LETTER,
2,
"Ex ctype1 lower",
&NumErrors);
// CTYPE 2.
// Variation 1 - ctype2, lower
rc = GetStringTypeExW(0x0409,
CT_CTYPE2,
pGSTSrcLower,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT2_LOCASE_LETTER,
2,
"Ex ctype2 lower",
&NumErrors);
// CTYPE 3.
// Variation 1 - ctype 3 should return zeros
rc = GetStringTypeExW(0x0409,
CT_CTYPE3,
pGSTSrcLower,
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT3_VALUE,
2,
"Ex ctype3 zero",
&NumErrors);
// Return total number of errors found.
return (NumErrors);
}
// GST_Ansi
// This routine tests the Ansi version of the API routine.
// 06-14-91 JulieB Created.
int GST_Ansi()
{
int NumErrors = 0; // error count - to be returned
int rc; // return code
// GetStringTypeA
// cbSrc.
// Variation 1 - cbSrc = -1
rc = GetStringTypeA(0x0409,
CT_CTYPE1,
"TH",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_UPCASE_LETTER,
2,
"A version cbSrc (-1)",
&NumErrors);
// Variation 2 - cbSrc = value
rc = GetStringTypeA(0x0409,
CT_CTYPE1,
"TH",
2,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_UPCASE_LETTER,
2,
"A version cbSrc (value)",
&NumErrors);
// CTYPE 1.
// Variation 1 - Ab
rc = GetStringTypeA(0x0409,
CT_CTYPE1,
"Ab",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0181\x0182\x0020",
3,
"A version ctype1 (Ab)",
&NumErrors);
// CTYPE 2.
// Variation 1 - Ab
rc = GetStringTypeA(0x0409,
CT_CTYPE2,
"Ab",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0001\x0001\x0000",
3,
"A version ctype2 (Ab)",
&NumErrors);
// CTYPE 3.
// Variation 1 - Ab
rc = GetStringTypeA(0x0409,
CT_CTYPE3,
"Ab",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x8040\x8040\x0000",
3,
"A version ctype3 (Ab)",
&NumErrors);
// Check invalid chars.
// Variation 1 - invalid chars
rc = GetStringTypeA(0x0411,
CT_CTYPE1,
"\xa0\xfd\xfe\xff\x85\x40\x81\x02\x81",
9,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0000\x0000\x0000\x0000\x0000\x0000\x0000",
7,
"A version ctype1 (invalid chars)",
&NumErrors);
// Variation 2 - invalid chars
rc = GetStringTypeA(0x0411,
CT_CTYPE2,
"\xa0\xfd\xfe\xff\x85\x40\x81\x02\x81",
9,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0000\x0000\x0000\x0000\x0000\x0000\x0000",
7,
"A version ctype2 (invalid chars)",
&NumErrors);
// Variation 3 - invalid chars
rc = GetStringTypeA(0x0411,
CT_CTYPE3,
"\xa0\xfd\xfe\xff\x85\x40\x81\x02\x81",
9,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0000\x0000\x0000\x0000\x0000\x0000\x0000",
7,
"A version ctype3 (invalid chars)",
&NumErrors);
// GetStringTypeExA
// cbSrc.
// Variation 1 - cbSrc = -1
rc = GetStringTypeExA(0x0409,
CT_CTYPE1,
"TH",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_UPCASE_LETTER,
2,
"Ex A version cbSrc (-1)",
&NumErrors);
// Variation 2 - cbSrc = value
rc = GetStringTypeExA(0x0409,
CT_CTYPE1,
"TH",
2,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
CT1_UPCASE_LETTER,
2,
"Ex A version cbSrc (value)",
&NumErrors);
// CTYPE 1.
// Variation 1 - Ab
rc = GetStringTypeExA(0x0409,
CT_CTYPE1,
"Ab",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0181\x0182\x0020",
3,
"Ex A version ctype1 (Ab)",
&NumErrors);
// CTYPE 2.
// Variation 1 - Ab
rc = GetStringTypeExA(0x0409,
CT_CTYPE2,
"Ab",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x0001\x0001\x0000",
3,
"Ex A version ctype2 (Ab)",
&NumErrors);
// CTYPE 3.
// Variation 1 - Ab
rc = GetStringTypeExA(0x0409,
CT_CTYPE3,
"Ab",
-1,
pCharType);
CheckReturnGetStringType(rc,
TRUE,
pCharType,
L"\x8040\x8040\x0000",
3,
"Ex A version ctype3 (Ab)",
&NumErrors);
// Return total number of errors found.
return (NumErrors);
}
// CheckReturnGetStringType
// Checks the return code from the valid GetStringType[A|W] call. It
// prints out the appropriate error if the incorrect result is found.
// 06-14-91 JulieB Created.
void CheckReturnGetStringType(
int CurrentReturn,
int ExpectedReturn,
LPWSTR pCurrentString,
LPWSTR pExpectedString,
int ExpectedSize,
LPSTR pErrString,
int* pNumErrors)
{
int ctr; // loop counter
if ((CurrentReturn != ExpectedReturn) ||
((pCurrentString != NULL) &&
(CompStringsW(pCurrentString, pExpectedString, ExpectedSize)))) {
printf("ERROR: %s - \n", pErrString);
printf(" Return = %d, Expected = %d\n", CurrentReturn, ExpectedReturn);
if (pCurrentString != NULL) {
printf(" ");
for (ctr = 0; ctr < ExpectedSize; ctr++) {
printf("%x ", pCurrentString[ctr]);
}
printf("\n");
}
(*pNumErrors)++;
}
}