/*++ 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); }