kerneltest/e32test/locale/t_currencyformat.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// e32test\locale\t_currencyformat.cpp
// Overview:
// Test the currency formatting capabilities of the locale class.
// API Information:
// TLocale.
// Details:
// - Set the currency symbol position before the currency amount.
// - Set no space between the currency symbol and the currency amount.
// - Set 2 decimal places to currency values. 
// - Set negative currency value to be enclosed in brackets without a minus sign.
// - Allow triads in currency values.
// - Set comma as separator to separate groups of three digits to the left of the decimal
// separator.
// - Set dot as separator to separate a whole number from its fractional part.
// - Set currency symbol to pound.
// - Test some simple English Locale currency formats and check it is as expected.
// - Render a currency value as text, based on the locale's currency and numeric format 
// settings and check the Overflow handling capability is as expected.
// - Change a variety of locale settings and verify currency formatting is as expected.
// - Change a variety of locale settings display the results.
// Platforms/Drives/Compatibility:
// All 
// Assumptions/Requirement/Pre-requisites:
// Failures and causes:
// Base Port information:
// 
//

#include <e32test.h> 
#include <e32std.h>
#include <e32std_private.h>

#ifdef __VC32__
    // Solve compilation problem caused by non-English locale
    #pragma setlocale("english")
#endif

_LIT(KNewLine, "\n");
LOCAL_D RTest test(_L("T_CurrencyFormat"));
LOCAL_D TLocale locale; 


class TTestOverflowHandler : public TDesOverflow
	{
	void Overflow(TDes& aDes);
	};

void TTestOverflowHandler::Overflow(TDes& aDes)
	{
	test.Printf(_L(" %S is too large... Overflow Handled!!"), &aDes);
	test.Printf(KNewLine);
	}


void SetEnglishCurrency()
	{
	locale.SetCurrencySymbolPosition(ELocaleBefore);
	locale.SetCurrencySpaceBetween(EFalse);
	locale.SetCurrencyDecimalPlaces(2);
	locale.SetCurrencyNegativeInBrackets(ETrue);
	locale.SetCurrencyTriadsAllowed(ETrue);
	locale.SetThousandsSeparator(',');
	locale.SetDecimalSeparator('.');
	User::SetCurrencySymbol(_L("\xA3"));
	}

void TestSimpleEnglishCurrencyFormat()
	{

	TBuf<32> fcurrency; 
	// Set a few of the locale variables and then test that formatting the amount
	// returns what we expected..... 
	test.Start(_L("Testing simple English Locale currency formats"));
	locale.FormatCurrency(fcurrency, 4000);
	test(fcurrency==_L("\xA3\x34\x30.00"));

	locale.FormatCurrency(fcurrency, -567654);
	test(fcurrency==_L("(\xA3\x35,676.54)"));
	
	locale.FormatCurrency(fcurrency,2);
	test(fcurrency==_L("\xA3\x30.02"));

	locale.FormatCurrency(fcurrency,12500000);
	test(fcurrency==_L("\xA3\x31\x32\x35,000.00"));

	locale.FormatCurrency(fcurrency, 00001);
	test(fcurrency==_L("\xA3\x30.01"));
	test.Printf(_L("SimplEnglishCurrencyPass"));
	}

void TestOverflowCapacity()
	{
	// try to test each stage that overflow at occur
	TBuf<10> smallcurrency;
	TTestOverflowHandler handler; 
	test.Next(_L("Testing the Overflow handling capability"));
	// test the overflow handling capability
	
	locale.SetCurrencyDecimalPlaces(11);
	locale.FormatCurrency(smallcurrency,handler,1);
	test(smallcurrency!=_L("0.00000000001"));
	locale.SetCurrencyDecimalPlaces(2);

	locale.FormatCurrency(smallcurrency,handler, -1234567890);
	test(smallcurrency!=_L("(\xA3\x31\x32\x33\x34\x35\x36\x37\x38.90)"));

	locale.FormatCurrency(smallcurrency, handler, 95000000);
	test(smallcurrency!=_L("\xA3\x39\x35\x30,000.00"));

	locale.SetCurrencySpaceBetween(ETrue);
	locale.FormatCurrency(smallcurrency, handler, 2000000);
	test(smallcurrency!=_L("\xA3 20,000.00"));

	locale.FormatCurrency(smallcurrency, handler, -240000);
	test(smallcurrency!=_L("(\xA3 2,400.00)"));

	User::SetCurrencySymbol(_L("Fake\xA3"));
	locale.FormatCurrency(smallcurrency, handler, 240);
	test(smallcurrency==_L("Fake\xA3 2.40"));

	locale.SetCurrencySpaceBetween(EFalse);
	locale.FormatCurrency(smallcurrency, handler, -240);
	test(smallcurrency!=_L("(Fake\xA3\x32.40)"));

	test.Printf(_L("Overflow Pass"));
		
	}

void TestChangeInformation()
	{
	TBuf<32> fcurrency; 
	// Make changes to the locale currency informationa and check formatting
	test.Next(_L("Changing locale information and testing currency Formatting "));
	// Change the format, add space in between
	locale.SetCurrencySpaceBetween(ETrue);
	locale.FormatCurrency(fcurrency,450);
	test(fcurrency==_L("\xA3 4.50"));
	// change the position of the CurrencySymbol 
	locale.SetCurrencySymbolPosition(ELocaleAfter);
	locale.FormatCurrency(fcurrency, 300000);
	test(fcurrency==_L("3,000.00 \xA3"));
	// test the negative format implementation
	locale.FormatCurrency(fcurrency , -3000);
	test(fcurrency!=_L("-30.00 \xA3"));
	test(fcurrency==_L("(30.00 \xA3)"));
	// call the deprecated function to check for compatability
	locale.SetCurrencyNegativeInBrackets(ETrue);
	locale.SetNegativeLoseSpace(ETrue);
	locale.SetNegativeCurrencySymbolOpposite(ETrue);
	locale.FormatCurrency(fcurrency,-2500);
	locale.SetNegativeCurrencySymbolOpposite(EFalse);
	locale.SetNegativeLoseSpace(EFalse);
	test(fcurrency==_L("(\xA3\x32\x35.00)"));

	locale.SetCurrencySymbolPosition(ELocaleBefore);
	locale.FormatCurrency(fcurrency, 300000);
	test(fcurrency==_L("\xA3 3,000.00"));
	// test the negative format implementation
	locale.FormatCurrency(fcurrency , -3000);
	test(fcurrency!=_L("-30.00 \xA3"));
	test(fcurrency==_L("(\xA3 30.00)"));
	// call the deprecated function to check for compatability
	locale.SetCurrencyNegativeInBrackets(ETrue);
	locale.SetNegativeLoseSpace(ETrue);
	locale.SetNegativeCurrencySymbolOpposite(ETrue);
	locale.FormatCurrency(fcurrency,-2500);
	locale.SetNegativeCurrencySymbolOpposite(EFalse);
	test(fcurrency==_L("(25.00\xA3)"));
	// test the New NegativeCurrencyFormat
	locale.SetNegativeCurrencyFormat(TLocale::EInterveningMinusSign);
	locale.FormatCurrency(fcurrency,-32500);
	test(fcurrency==_L("\xA3-325.00"));
	// test the decimal places implementation
	locale.SetCurrencyDecimalPlaces(6);
	locale.FormatCurrency(fcurrency,-32500);
	locale.SetNegativeLoseSpace(EFalse);
	test(fcurrency==_L("\xA3-0.032500"));
	// testing Thousandseparators and triads
	locale.SetCurrencyDecimalPlaces(2);
	locale.SetThousandsSeparator(' ');
	locale.SetCurrencySymbolPosition(ELocaleAfter);
	locale.FormatCurrency(fcurrency, 300000000);
	test(fcurrency==_L("3 000 000.00 \xA3"));

	locale.SetCurrencyTriadsAllowed(EFalse);
	locale.FormatCurrency(fcurrency, 300000000);
	test(fcurrency==_L("3000000.00 \xA3"));
	// test the other NegativeCurrencyFormat Options
	locale.SetNegativeCurrencyFormat(TLocale::ETrailingMinusSign);
	locale.FormatCurrency(fcurrency, -24000000);
	test(fcurrency==_L("240000.00 \xA3-"));

	locale.SetNegativeCurrencyFormat(TLocale::EInterveningMinusSign);
	locale.FormatCurrency(fcurrency, -40000000);
	test(fcurrency== _L("400000.00- \xA3"));
	// change the currency symbol 
	User::SetCurrencySymbol(_L("NZ$"));
	locale.FormatCurrency(fcurrency,250000);
	test(fcurrency!=_L("2,500.00 \xA3"));
	test(fcurrency==_L("2500.00 NZ$"));
	// move the currency symbol forward
	locale.SetCurrencySymbolPosition(ELocaleBefore);
	locale.FormatCurrency(fcurrency,300);
	test(fcurrency==_L("NZ$ 3.00"));

	locale.SetCurrencySpaceBetween(EFalse);
	locale.FormatCurrency(fcurrency, 43020);
	test(fcurrency==_L("NZ$430.20"));

	locale.SetCurrencyTriadsAllowed(ETrue);
	locale.SetThousandsSeparator(',');
	locale.SetCurrencySpaceBetween(ETrue);
	locale.FormatCurrency(fcurrency,-2450000);
	test(fcurrency==_L("NZ$ -24,500.00"));
	locale.SetNegativeCurrencySymbolOpposite(EFalse);
	
	
	}

void TestDisplyCurrencyFormats() 
	{

	// Display Differenct locale currency as a test 
	test.Next(_L("Samples of a few Currency formats that can be displayed"));
	TBuf<32> fcurrency; 
	locale.FormatCurrency (fcurrency, 2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetCurrencySpaceBetween(EFalse);
	User::SetCurrencySymbol(_L("\xA3"));
	locale.SetCurrencySymbolPosition(ELocaleAfter);
	locale.FormatCurrency (fcurrency, 2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetCurrencySymbolPosition(ELocaleBefore);
	User::SetCurrencySymbol(_L("$"));
	locale.SetNegativeCurrencyFormat(TLocale::EInBrackets);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetNegativeCurrencyFormat(TLocale::ELeadingMinusSign);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetNegativeCurrencySymbolOpposite(ETrue);
	locale.SetNegativeLoseSpace(ETrue);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetNegativeCurrencySymbolOpposite(EFalse);
	locale.SetNegativeCurrencyFormat(TLocale::EInterveningMinusSign);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	//******************

	locale.SetCurrencySymbolPosition(ELocaleAfter);
	User::SetCurrencySymbol(_L("$"));
	locale.SetNegativeCurrencyFormat(TLocale::EInBrackets);
	locale.SetNegativeLoseSpace(ETrue);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetNegativeCurrencyFormat(TLocale::ELeadingMinusSign);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetNegativeCurrencySymbolOpposite(ETrue);
	locale.SetNegativeLoseSpace(ETrue);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);
	locale.SetNegativeCurrencySymbolOpposite(EFalse);
	locale.SetNegativeCurrencyFormat(TLocale::EInterveningMinusSign);
	locale.FormatCurrency (fcurrency, -2500000);
	test.Printf(fcurrency);
	test.Printf(KNewLine);

	//******************
	TInt64 x=25000000;
	x*=10000;
	locale.FormatCurrency (fcurrency,x );
	test.Printf(fcurrency);
	test.Printf(KNewLine);


	}

GLDEF_C TInt E32Main(void)
	{

	// Call all the tests from here 
	test.Title();
	SetEnglishCurrency(); 
	TestSimpleEnglishCurrencyFormat();
	TestOverflowCapacity();
	SetEnglishCurrency(); 
	TestChangeInformation();
	TestDisplyCurrencyFormats();
	test.End();
	return KErrNone; 
	}