|
|
/*++
Copyright (c) 1991-1999, Microsoft Corporation All rights reserved.
Module Name:
gnftest.c
Abstract:
Test module for NLS API GetNumberFormat.
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:
07-28-93 JulieB Created.
--*/
//
// Include Files.
//
#include "nlstest.h"
//
// Constant Declarations.
//
#define BUFSIZE 500 // buffer size in wide chars
#define GNF_INVALID_FLAGS ((DWORD)(~(LOCALE_NOUSEROVERRIDE)))
#define GNF_ENGLISH_US L"1,234,567.44"
#define GNF_CZECH L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44"
//
// Global Variables.
//
LCID Locale;
LPWSTR pValue; LPWSTR pNegValue;
NUMBERFMT NumFmt;
WCHAR lpNumberStr[BUFSIZE];
//
// Number format buffers must be in line with the pAllLocales global
// buffer.
//
LPWSTR pPosNumber[] = { L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0402
L"1,234,567.44", // 0x0404
L"1,234,567.44", // 0x0804
L"1,234,567.44", // 0x0c04
L"1,234,567.44", // 0x1004
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0405
L"1.234.567,44", // 0x0406
L"1.234.567,44", // 0x0407
L"1'234'567.44", // 0x0807
L"1.234.567,44", // 0x0c07
L"1.234.567,44", // 0x0408
L"1,234,567.44", // 0x0409
L"1,234,567.44", // 0x0809
L"1,234,567.44", // 0x0c09
L"1,234,567.44", // 0x1009
L"1,234,567.44", // 0x1409
L"1,234,567.44", // 0x1809
L"1.234.567,44", // 0x040a
L"1,234,567.44", // 0x080a
L"1.234.567,44", // 0x0c0a
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x040b
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x040c
L"1.234.567,44", // 0x080c
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0c0c
L"1'234'567.44", // 0x100c
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x040e
L"1.234.567,44", // 0x040f
L"1.234.567,44", // 0x0410
L"1'234'567.44", // 0x0810
L"1,234,567.44", // 0x0411
L"1,234,567.44", // 0x0412
L"1.234.567,44", // 0x0413
L"1.234.567,44", // 0x0813
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0414
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0814
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0415
L"1.234.567,44", // 0x0416
L"1.234.567,44", // 0x0816
L"1.234.567,44", // 0x0418
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0419
L"1.234.567,44", // 0x041a
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x041b
L"1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x041d
L"1.234.567,44", // 0x041f
L"1.234.567,44" // 0x0424
};
LPWSTR pNegNumber[] = { L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0402
L"-1,234,567.44", // 0x0404
L"-1,234,567.44", // 0x0804
L"-1,234,567.44", // 0x0c04
L"-1,234,567.44", // 0x1004
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0405
L"-1.234.567,44", // 0x0406
L"-1.234.567,44", // 0x0407
L"-1'234'567.44", // 0x0807
L"-1.234.567,44", // 0x0c07
L"-1.234.567,44", // 0x0408
L"-1,234,567.44", // 0x0409
L"-1,234,567.44", // 0x0809
L"-1,234,567.44", // 0x0c09
L"-1,234,567.44", // 0x1009
L"-1,234,567.44", // 0x1409
L"-1,234,567.44", // 0x1809
L"-1.234.567,44", // 0x040a
L"-1,234,567.44", // 0x080a
L"-1.234.567,44", // 0x0c0a
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x040b
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x040c
L"-1.234.567,44", // 0x080c
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0c0c
L"-1'234'567.44", // 0x100c
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x040e
L"-1.234.567,44", // 0x040f
L"-1.234.567,44", // 0x0410
L"-1'234'567.44", // 0x0810
L"-1,234,567.44", // 0x0411
L"-1,234,567.44", // 0x0412
L"-1.234.567,44", // 0x0413
L"-1.234.567,44", // 0x0813
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0414
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0814
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0415
L"-1.234.567,44", // 0x0416
L"-1.234.567,44", // 0x0816
L"-1.234.567,44", // 0x0418
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x0419
L"- 1.234.567,44", // 0x041a
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x041b
L"-1\x00a0\x0032\x0033\x0034\x00a0\x0035\x0036\x0037,44", // 0x041d
L"-1.234.567,44", // 0x041f
L"-1.234.567,44" // 0x0424
};
//
// Forward Declarations.
//
BOOL InitGetNumberFormat();
int GNF_BadParamCheck();
int GNF_NormalCase();
int GNF_Ansi();
////////////////////////////////////////////////////////////////////////////
//
// TestGetNumberFormat
//
// Test routine for GetNumberFormatW API.
//
// 07-28-93 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int TestGetNumberFormat() { int ErrCount = 0; // error count
//
// Print out what's being done.
//
printf("\n\nTESTING GetNumberFormatW...\n\n");
//
// Initialize global variables.
//
if (!InitGetNumberFormat()) { printf("\nABORTED TestGetNumberFormat: Could not Initialize.\n"); return (1); }
//
// Test bad parameters.
//
ErrCount += GNF_BadParamCheck();
//
// Test normal cases.
//
ErrCount += GNF_NormalCase();
//
// Test Ansi version.
//
ErrCount += GNF_Ansi();
//
// Print out result.
//
printf("\nGetNumberFormatW: ERRORS = %d\n", ErrCount);
//
// Return total number of errors found.
//
return (ErrCount); }
////////////////////////////////////////////////////////////////////////////
//
// InitGetNumberFormat
//
// This routine initializes the global variables. If no errors were
// encountered, then it returns TRUE. Otherwise, it returns FALSE.
//
// 07-28-93 JulieB Created.
////////////////////////////////////////////////////////////////////////////
BOOL InitGetNumberFormat() { //
// Make a Locale.
//
Locale = MAKELCID(0x0409, 0);
//
// Initialize the value.
//
pValue = L"1234567.4444"; pNegValue = L"-1234567.4444";
//
// Initialize the number format structure.
//
NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1; NumFmt.Grouping = 3; NumFmt.lpDecimalSep = L"/"; NumFmt.lpThousandSep = L";"; NumFmt.NegativeOrder = 1;
//
// Return success.
//
return (TRUE); }
////////////////////////////////////////////////////////////////////////////
//
// GNF_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.
//
// 07-28-93 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int GNF_BadParamCheck() { int NumErrors = 0; // error count - to be returned
int rc; // return code
NUMBERFMT MyNumFmt; // number format
//
// Bad Locale.
//
// Variation 1 - Bad Locale
rc = GetNumberFormatW( (LCID)333, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "Bad Locale", &NumErrors );
//
// Null Pointers.
//
// Variation 1 - lpNumberStr = NULL
rc = GetNumberFormatW( Locale, 0, pValue, NULL, NULL, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "lpNumberStr NULL", &NumErrors );
// Variation 2 - lpValue = NULL
rc = GetNumberFormatW( Locale, 0, NULL, NULL, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "lpNumberStr NULL", &NumErrors );
//
// Bad Count.
//
// Variation 1 - cchNumber < 0
rc = GetNumberFormatW( Locale, 0, pValue, NULL, lpNumberStr, -1 ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "cchNumber < 0", &NumErrors );
//
// Invalid Flag.
//
// Variation 1 - dwFlags = invalid
rc = GetNumberFormatW( Locale, GNF_INVALID_FLAGS, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "Flag invalid", &NumErrors );
// Variation 2 - lpFormat and NoUserOverride
rc = GetNumberFormatW( Locale, LOCALE_NOUSEROVERRIDE, pValue, &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "lpFormat and NoUserOverride", &NumErrors );
// Variation 3 - Use CP ACP, lpFormat and NoUserOverride
rc = GetNumberFormatW( Locale, LOCALE_USE_CP_ACP | LOCALE_NOUSEROVERRIDE, pValue, &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_FLAGS, "Use CP ACP, lpFormat and NoUserOverride", &NumErrors );
//
// Buffer Too Small.
//
// Variation 1 - cchNumber = too small
rc = GetNumberFormatW( Locale, 0, pValue, NULL, lpNumberStr, 2 ); CheckReturnBadParam( rc, 0, ERROR_INSUFFICIENT_BUFFER, "cchNumber too small", &NumErrors );
//
// Bad format passed in.
//
// Variation 1 - bad NumDigits
MyNumFmt.NumDigits = 10; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad NumDigits", &NumErrors );
// Variation 2 - bad LeadingZero
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 2; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad LeadingZero", &NumErrors );
// Variation 3 - bad Grouping
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 10000; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad Grouping", &NumErrors );
// Variation 4 - bad DecimalSep
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = NULL; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad DecimalSep", &NumErrors );
// Variation 5 - bad DecimalSep 2
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"////"; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad DecimalSep 2", &NumErrors );
// Variation 6 - bad DecimalSep 3
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"6"; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad DecimalSep 3", &NumErrors );
// Variation 7 - bad ThousandSep
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = NULL; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad ThousandSep", &NumErrors );
// Variation 8 - bad ThousandSep 2
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = L";;;;"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad ThousandSep 2", &NumErrors );
// Variation 9 - bad ThousandSep 3
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = L"6"; MyNumFmt.NegativeOrder = 1; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad ThousandSep 3", &NumErrors );
// Variation 10 - bad negative order
MyNumFmt.NumDigits = 3; MyNumFmt.LeadingZero = 1; MyNumFmt.Grouping = 3; MyNumFmt.lpDecimalSep = L"/"; MyNumFmt.lpThousandSep = L";"; MyNumFmt.NegativeOrder = 5; rc = GetNumberFormatW( Locale, 0, pValue, &MyNumFmt, lpNumberStr, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "bad negative order", &NumErrors );
//
// Return total number of errors found.
//
return (NumErrors); }
////////////////////////////////////////////////////////////////////////////
//
// GNF_NormalCase
//
// This routine tests the normal cases of the API routine.
//
// 07-28-93 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int GNF_NormalCase() { 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 = GetNumberFormatW( LOCALE_SYSTEM_DEFAULT, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "sys default locale", &NumErrors );
// Variation 2 - Current User Locale
rc = GetNumberFormatW( LOCALE_USER_DEFAULT, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "current user locale", &NumErrors );
//
// Language Neutral.
//
// Variation 1 - neutral
rc = GetNumberFormatW( 0x0000, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "neutral locale", &NumErrors );
// Variation 2 - sys default
rc = GetNumberFormatW( 0x0400, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "sys default locale", &NumErrors );
// Variation 3 - user default
rc = GetNumberFormatW( 0x0800, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "user default locale", &NumErrors );
// Variation 4 - sub lang neutral US
rc = GetNumberFormatW( 0x0009, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "sub lang neutral US", &NumErrors );
// Variation 5 - sub lang neutral Czech
rc = GetNumberFormatW( 0x0005, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_CZECH, "sub lang neutral Czech", &NumErrors );
//
// Use CP ACP.
//
// Variation 1 - Use CP ACP, System Default Locale
rc = GetNumberFormatW( LOCALE_SYSTEM_DEFAULT, LOCALE_USE_CP_ACP, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "Use CP ACP, sys default locale", &NumErrors );
//
// cchNumber.
//
// Variation 1 - cchNumber = size of lpNumberStr buffer
rc = GetNumberFormatW( Locale, 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "cchNumber = bufsize", &NumErrors );
// Variation 2 - cchNumber = 0
lpNumberStr[0] = 0x0000; rc = GetNumberFormatW( Locale, 0, pValue, NULL, lpNumberStr, 0 ); CheckReturnValidW( rc, -1, NULL, GNF_ENGLISH_US, "cchNumber zero", &NumErrors );
// Variation 3 - cchNumber = 0, lpNumberStr = NULL
rc = GetNumberFormatW( Locale, 0, pValue, NULL, NULL, 0 ); CheckReturnValidW( rc, -1, NULL, GNF_ENGLISH_US, "cchNumber (NULL ptr)", &NumErrors );
//
// lpFormat - pValue = 1234567.4444
//
// NumFmt.NumDigits = 3;
// NumFmt.LeadingZero = 1;
// NumFmt.Grouping = 3;
// NumFmt.lpDecimalSep = L"/";
// NumFmt.lpThousandSep = L";";
// NumFmt.NegativeOrder = 1;
//
// Variation 1 - lpFormat
rc = GetNumberFormatW( 0x0409, 0, pValue, &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1;234;567/444", "lpFormat (1;234;567/444)", &NumErrors );
// Variation 2 - lpFormat leading zero
rc = GetNumberFormatW( 0x0409, 0, L".4444", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"0/444", "lpFormat (0/444)", &NumErrors );
// Variation 3 - lpFormat no decimal
rc = GetNumberFormatW( 0x0409, 0, L"1234567", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1;234;567/000", "lpFormat (1;234;567/000)", &NumErrors );
// Variation 4 - grouping check
rc = GetNumberFormatW( 0x0409, 0, L"123456", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"123;456/000", "lpFormat (123;456/000)", &NumErrors );
// Variation 5 - grouping check
rc = GetNumberFormatW( 0x0409, 0, L"12", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"12/000", "grouping (12/000)", &NumErrors );
// Variation 6 - rounding check
NumFmt.NumDigits = 0; rc = GetNumberFormatW( 0x0409, 0, L".9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1", "rounding (1)", &NumErrors ); NumFmt.NumDigits = 3;
// Variation 7 - rounding check
NumFmt.NumDigits = 0; NumFmt.LeadingZero = 0; rc = GetNumberFormatW( 0x0409, 0, L".9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1", "rounding (1) 2", &NumErrors ); NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1;
// Variation 8 - rounding check
NumFmt.NumDigits = 0; rc = GetNumberFormatW( 0x0409, 0, L".4999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"0", "rounding (0)", &NumErrors ); NumFmt.NumDigits = 3;
// Variation 9 - rounding check
NumFmt.NumDigits = 0; NumFmt.LeadingZero = 0; rc = GetNumberFormatW( 0x0409, 0, L".4999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"0", "rounding (0) 2", &NumErrors ); NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1;
// Variation 10 - strip leading zeros
rc = GetNumberFormatW( 0x0409, 0, L"000000034.5", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"34/500", "strip zeros (34/500)", &NumErrors );
// Variation 11 - neg zero value
rc = GetNumberFormatW( 0x0409, 0, L"-0.0001", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"0/000", "neg zero (0/000)", &NumErrors );
// Variation 12 - neg zero value
rc = GetNumberFormatW( 0x0409, 0, L"-0.0009", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-0/001", "neg zero (-0/001)", &NumErrors );
//
// Flag values.
//
// Variation 1 - NOUSEROVERRIDE
rc = GetNumberFormatW( Locale, LOCALE_NOUSEROVERRIDE, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, GNF_ENGLISH_US, "NoUserOverride", &NumErrors );
//
// Test all locales - pValue = 1234567.4444
//
for (ctr = 0; ctr < NumLocales; ctr++) { rc = GetNumberFormatW( pAllLocales[ctr], 0, pValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidLoopW( rc, -1, lpNumberStr, pPosNumber[ctr], "Pos", pAllLocales[ctr], &NumErrors ); }
//
// Test all locales - pNegValue = -1234567.4444
//
for (ctr = 0; ctr < NumLocales; ctr++) { rc = GetNumberFormatW( pAllLocales[ctr], 0, pNegValue, NULL, lpNumberStr, BUFSIZE ); CheckReturnValidLoopW( rc, -1, lpNumberStr, pNegNumber[ctr], "Neg", pAllLocales[ctr], &NumErrors ); }
//
// Special case checks.
//
// Variation 1 - rounding check
NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1; NumFmt.Grouping = 0; NumFmt.lpDecimalSep = L"."; NumFmt.lpThousandSep = L","; NumFmt.NegativeOrder = 1;
rc = GetNumberFormatW( 0x0409, 0, L"799.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"800.000", "rounding (800.000)", &NumErrors );
NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1; NumFmt.Grouping = 2; NumFmt.lpDecimalSep = L"."; NumFmt.lpThousandSep = L","; NumFmt.NegativeOrder = 1;
rc = GetNumberFormatW( 0x0409, 0, L"799.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"8,00.000", "rounding (8,00.000)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-799.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-8,00.000", "rounding (-8,00.000)", &NumErrors );
// Variation 2 - rounding check
NumFmt.NumDigits = 0 ; NumFmt.LeadingZero = 1 ; NumFmt.Grouping = 2 ; NumFmt.lpDecimalSep = L"." ; NumFmt.lpThousandSep = L"," ; NumFmt.NegativeOrder = 1 ;
rc = GetNumberFormatW( 0x0409, 0, L"9.500", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"10", "rounding (10)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-9.500", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-10", "rounding (-10)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"99.500", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1,00", "rounding (1,00)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-99.500", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-1,00", "rounding (-1,00)", &NumErrors );
// Variation 3 - rounding check
NumFmt.NumDigits = 2; NumFmt.LeadingZero = 1; NumFmt.Grouping = 3; NumFmt.NegativeOrder = 1; NumFmt.lpDecimalSep = L"/"; NumFmt.lpThousandSep = L";";
rc = GetNumberFormatW( 0x0409, 0, L"1.3", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1/30", "rounding (1/30)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"1.399", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1/40", "rounding (1/40)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"0.999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1/00", "rounding (1/00)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L".999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1/00", "rounding (1/00) 2", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-1.3", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-1/30", "rounding (-1/30)", &NumErrors );
//
// Variation 4 - rounding check
//
NumFmt.NumDigits = 3; NumFmt.LeadingZero = 0; NumFmt.Grouping = 2; NumFmt.NegativeOrder = 1; NumFmt.lpDecimalSep = L"."; NumFmt.lpThousandSep = L",";
rc = GetNumberFormatW( 0x0409, 0, L".9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1.000", "rounding (1.000)", &NumErrors );
// Variation 5 - grouping check
NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1; NumFmt.Grouping = 32; NumFmt.lpDecimalSep = L"."; NumFmt.lpThousandSep = L","; NumFmt.NegativeOrder = 1;
rc = GetNumberFormatW( 0x0409, 0, L"1234567.999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"12,34,567.999", "grouping (12,34,567.999)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-1234567.999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-12,34,567.999", "grouping (-12,34,567.999)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"9999999.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1,00,00,000.000", "grouping/rounding (1,00,00,000.000)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-9999999.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-1,00,00,000.000", "grouping/rounding (-1,00,00,000.000)", &NumErrors );
// Variation 6 - grouping check
NumFmt.NumDigits = 3; NumFmt.LeadingZero = 1; NumFmt.Grouping = 320; NumFmt.lpDecimalSep = L"."; NumFmt.lpThousandSep = L","; NumFmt.NegativeOrder = 1;
rc = GetNumberFormatW( 0x0409, 0, L"123456789.999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"1234,56,789.999", "grouping (1234,56789.999)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-123456789.999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-1234,56,789.999", "grouping (-1234,56,789.999)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"9999999.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"100,00,000.000", "grouping/rounding (100,00,000.000)", &NumErrors );
rc = GetNumberFormatW( 0x0409, 0, L"-9999999.9999", &NumFmt, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"-100,00,000.000", "grouping/rounding (-100,00,000.000)", &NumErrors );
// Variation 7 - large number check
SetLastError(0); rc = GetNumberFormat( LOCALE_USER_DEFAULT, 0, L"10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", NULL, lpNumberStr, BUFSIZE ); CheckReturnValidW( rc, -1, lpNumberStr, L"10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", "big number", &NumErrors ); CheckLastError( 0, "Last Error should be 0 - call should have succeeded", &NumErrors );
//
// Return total number of errors found.
//
return (NumErrors); }
////////////////////////////////////////////////////////////////////////////
//
// GNF_Ansi
//
// This routine tests the Ansi version of the API routine.
//
// 07-28-93 JulieB Created.
////////////////////////////////////////////////////////////////////////////
int GNF_Ansi() { int NumErrors = 0; // error count - to be returned
int rc; // return code
BYTE pNumStrA[BUFSIZE]; // ptr to number string buffer
NUMBERFMTA NumFmtA; // number format structure
//
// GetNumberFormatA.
//
// Variation 1 - cchNumber = size of lpNumberStr buffer
rc = GetNumberFormatA( Locale, 0, "123456.789", NULL, pNumStrA, BUFSIZE ); CheckReturnValidA( rc, -1, pNumStrA, "123,456.79", NULL, "A version cchNumber = bufsize", &NumErrors );
// Variation 2 - cchNumber = 0
pNumStrA[0] = 0x00; rc = GetNumberFormatA( Locale, 0, "123456.789", NULL, pNumStrA, 0 ); CheckReturnValidA( rc, -1, NULL, "123,456.79", NULL, "A version cchNumber zero", &NumErrors );
// Variation 3 - cchNumber = 0, lpNumberStr = NULL
rc = GetNumberFormatA( Locale, 0, "123456.789", NULL, NULL, 0 ); CheckReturnValidA( rc, -1, NULL, "123,456.79", NULL, "A version cchNumber (NULL ptr)", &NumErrors );
//
// Use CP ACP.
//
// Variation 1 - Use CP ACP, cchNumber = bufsize
rc = GetNumberFormatA( Locale, LOCALE_USE_CP_ACP, "123456.789", NULL, pNumStrA, BUFSIZE ); CheckReturnValidA( rc, -1, pNumStrA, "123,456.79", NULL, "A version Use CP ACP, cchNumber = bufsize", &NumErrors );
//
// lpFormat - pValue = 1234567.4444
//
NumFmtA.NumDigits = 3; NumFmtA.LeadingZero = 1; NumFmtA.Grouping = 3; NumFmtA.lpDecimalSep = "/"; NumFmtA.lpThousandSep = NULL; NumFmtA.NegativeOrder = 3;
// Variation 1 - lpFormat
rc = GetNumberFormatA( 0x0409, 0, "1234567.4444", &NumFmtA, pNumStrA, BUFSIZE ); CheckReturnBadParam( rc, 0, ERROR_INVALID_PARAMETER, "A version bad ThousandSep", &NumErrors );
NumFmtA.NumDigits = 3; NumFmtA.LeadingZero = 1; NumFmtA.Grouping = 3; NumFmtA.lpDecimalSep = "/"; NumFmtA.lpThousandSep = ";"; NumFmtA.NegativeOrder = 3;
// Variation 1 - lpFormat
rc = GetNumberFormatA( 0x0409, 0, "1234567.4444", &NumFmtA, pNumStrA, BUFSIZE ); CheckReturnValidA( rc, -1, pNumStrA, "1;234;567/444", NULL, "lpFormat (1;234;567/444)", &NumErrors );
//
// Return total number of errors found.
//
return (NumErrors); }
|