kerneltest/e32test/buffer/t_buf.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 0 a41df078684a
child 43 c1f20ce4abcf
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) 1994-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\buffer\t_buf.cpp
// Overview:
// Test methods of the TBuf16, TBuf8, TBuf template class.
// API Information:
// TBuf16, TBuf8, TBuf.
// Details :
// - Create some 16 bit modifiable descriptors, 8 bit modifiable descriptors
// of fixed length, Build-independent modifiable descriptors, initialize 
// with different strings and check for
// - Comparison operators,
// - Property access methods,
// - Fill & swap methods,
// - Conversion methods,
// - Comparison methods,
// - Pattern Matching methods,
// - Pattern Locating methods,
// - Copying methods, 
// - Find, FindC, FindF methods,
// - Repeat, Trim, TrimLeft, TrimRight, Insert, Delete, Left,
// Right, Mid methods,
// - Formatting methods,
// - Replace methods are as expected.
// - Construct some descriptors with buffer length, string and buffer reference and
// verify that they are created successfully.
// - Test assignment operators and comparison operators for different descriptors.
// - Initialize some descriptors and check descriptors' maximum length, length and 
// size are as expected. 
// - Check Fill and Swap methods are as expected.
// - Test Fold, Collate, LowerCase, UpperCase methods are as expected.
// - Test Comparison methods are as expected.
// - Test pattern matching for simple string, wild cards with collated comparison. Verify that the 
// return value is KErrNotFound when pattern doesn't match.
// - Check Locating methods by searching character in forward and backward direction and 
// verify the return value is KErrNotFound when unavailable character is searched.
// - Check copying strings and converting those into lower and upper case strings are
// as expected.
// - Check Find methods by searching string and verify the return value is KErrNotFound when 
// unavailable string is searched.
// - Check Repeat, Trim, Insert and Delete methods are as expected.
// - Check the formatting operations are as expected.
// - Check integer to decimal character representation is as expected.
// - Check integer to character representation with different number system is as expected.
// - Check string formatting with variable parameter list is as expected
// - Check Replace method by replacing string at different places in a string is as expected.
// - Check the conversion of real numbers, extended precision real numbers into string
// format is as expected.
// - Check Format and FormatList methods are as expected.
// - Check Format of TReal is as expected.
// - Check the non-leaving and leaving descriptors overflow handlers are as expected. 
// Platforms/Drives/Compatibility:
// All 
// Assumptions/Requirement/Pre-requisites:
// Failures and causes:
// Base Port information:
// 
//

#include <e32test.h>
#include <e32math.h>
#include <hal.h>
#include <hal_data.h>
#include <hal_data.h>
#include <e32svr.h>

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

LOCAL_D RTest test(_L("T_BUF"));

#pragma warning(disable: 4127) // disabling warning "conditional expression is constant"
#pragma warning(disable: 4310) // disabling warning "cast truncates constant value"

#undef _TL
#define _TL(a) DESTEMPLATE((S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a)) 
#undef _TS
#define _TS(a) ((const S*)RTest::String(sizeof(S),(TText8*)a,(TText16*)L ## a)) 

template<class T,class S,class DESTEMPLATE>	
class TestTBuf
	{
public:
	TestTBuf(TInt aLength); // Test class constructor.
	void Test1();   // Tests all functions of the class.
	void Test2();   // Tests all constructors.
	void Test3();	// Tests all assignment operators
	void Test4();	// Tests all comparison operators
	void Test5();	// Tests all property access
	void Test6();	// Tests all fill and swap
	void Test7();	// Tests all conversion 
	void Test8();	// Tests all comparison
	void Test9();	// Tests all matching
	void Test10();	// Tests all locating
	void Test11();	// Tests all Copying
	void Test12();	// Tests all finding
	void Test13();	// Tests all basic like ops
	void Test14();  // Tests all formating
	void Test15();  // Tests all replacing
	void test_TBuf(); // Test all classes
protected:
	void Test1List(T* a,T* b,...);
	void Test14_ReorderedParameterFormatting(TInt aDummyParameter, ...);
private:
	TInt iMaxBufLength;
	};

void TestEq(const TDesC8& a, const TDesC8& b, TInt aLine)
	{
	if (a!=b)
		{
		TBuf<256> buf;
		test.Printf(_L("LINE %d:\n"),aLine);
		buf.Copy(a);
		test.Printf(_L("a=%S\n"),&buf);
		buf.Copy(b);
		test.Printf(_L("b=%S\n"),&buf);
		test(0);
		}
	}

void TestEq(const TDesC16& a, const TDesC16& b, TInt aLine)
	{
	if (a!=b)
		{
		test.Printf(_L("LINE %d:\n"),aLine);
		test.Printf(_L("a=%S\n"),&a);
		test.Printf(_L("b=%S\n"),&b);
		test(0);
		}
	}

#define TESTEQ(a,b)	TestEq((a),(b),__LINE__)

template <class T,class S,class DESTEMPLATE>
GLDEF_C TestTBuf<T,S,DESTEMPLATE>::TestTBuf(TInt aLength)
// Constructor.
	: iMaxBufLength(aLength)
	{}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test1List(T* a,T* b,...)
// Test the format with list functions.
	{
	VA_LIST list;
	VA_START(list,b);
	a->Format(*b,list);
	VA_START(list,b);
	a->AppendFormat(*b,list);
	VA_START(list,b);
	a->Format(_TL("%d"),list);
	VA_START(list,b);
	a->AppendFormat(_TL("%d"),list);
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test1()
// Tests all functions of the class.
	{
	test.Start(_L("Constructors"));
	T a;
	T b;
	T c(_TL("AB"));
	T d(c);

// To avoid unused warning
    a.Length();
    b.Length();
    c.Length();
    d.Length();

	test.Next(_L("Copy operators"));
	a=_TL("DE");
	b=c;
	a+=_TL("DE");
	b+=c;

	test.Next(_L("Comparison operators"));
	TInt t=(a<b);
	t=(a<_TL("AB"));
	t=(_TL("AB")<a);
	t=(a<=b);
	t=(a<=_TL("AB"));
	t=(_TL("AB")<=a);
	t=(a>b);
	t=(a>_TL("AB"));
	t=(_TL("AB")>a);
	t=(a>=b);
	t=(a>=_TL("AB"));
	t=(_TL("AB")>=a);
	t=(a==b);
	t=(a==_TL("AB"));
	t=(_TL("AB")==a);
	t=(a!=_TL("AB"));
	t=(_TL("AB")!=a);

	test.Next(_L("Property access"));
	a[0]='A';
	a.Ptr();
	TInt i=a.MaxLength()-a.Length();
	i=a.Size();
	a.Zero();
	a.SetLength(2); 

	test.Next(_L("Fill & swap"));
	a.Fill(' ');
	a.Fill(' ',iMaxBufLength);
	a.FillZ();
	a.FillZ(iMaxBufLength);
	a.Swap(b);

	test.Next(_L("Conversion"));
	a.Fold();
	a.Collate();
	a.LowerCase();
	a.UpperCase();
	a.Capitalize();

	test.Next(_L("Comparison"));
	a.Compare(b);
	a.Compare(_TL("AB"));
	a.CompareF(b);
	a.CompareF(_TL("AB"));
	a.CompareC(b);
	a.CompareC(_TL("AB"));

	test.Next(_L("Matching"));
	a.Match(b);
	a.Match(_TL("AB"));
	a.MatchF(b);
	a.MatchF(_TL("AB"));

	T buf(_TL("abcdef"));
	TInt res = buf.MatchF(_TL("abc*def"));
	test(res == 0);

	a.MatchC(b);
	a.MatchC(_TL("AB"));

	test.Next(_L("Locating"));
	a.Locate('A');
	a.LocateF('A');
	a.LocateReverse('A');
	a.LocateReverseF('A');

	test.Next(_L("Copying"));
	a.Copy(b);
	a.Copy(_TL("AB"));
//	a.Copy(_TL("AB"),1);
	a.CopyF(b);
	a.CopyF(_TL("AB"));
	a.CopyC(b);
	a.CopyC(_TL("AB"));
	a.CopyLC(b);
	a.CopyLC(_TL("AB"));
	a.CopyUC(b);
	a.CopyUC(_TL("AB"));
	a.CopyCP(b);
	a.CopyCP(_TL("AB"));

	test.Next(_L("Finding"));
	a.Find(b);
	a.Find(_TL("AB"));
	a.FindF(b);
	a.FindF(_TL("AB"));
	a.FindC(b);
	a.FindC(_TL("AB"));

	test.Next(_L("Basic like ops"));
	a.Repeat(b);
	a.Repeat(_TL("AB"));
	a.TrimLeft();
	a.TrimRight();
	a.Trim();
	b=_TL("AA");
	a.Insert(0,b);
	a.Delete(0,2);
	b = a.Left(1);
	b = a.Right(1);
	b = a.Mid(0,1);

	test.Next(_L("Formating"));
	a.Justify(_TL("AB"),10,ELeft,' ');
	a.Justify(b,10,ELeft,' ');
	b.Fill('A',2);
	a.Zero();
	a.AppendJustify(_TL("AB"),10,ELeft,' ');
	a.AppendJustify(b,10,ELeft,' ');
	TInt v1=10;
	a.Num(v1);
	a.AppendNum(v1);
	TInt v2=10;
	a.Num((TUint)v2,EHex);
	a.AppendNum((TUint)v2,EHex);
	a.NumUC((TUint)v2,EHex);
	a.AppendNumUC((TUint)v2,EHex);
	TReal v3=10.0;
	TRealFormat ff;
	ff.iType=KRealFormatFixed;
	ff.iWidth=10;
	ff.iPlaces=2;
	ff.iPoint='.';
	ff.iTriad=',';
	ff.iTriLen=3;
	a.Num(v3,ff);
	a.AppendNum(v3,ff);
	a.Format(_TL("%d"),12);
	a.AppendFormat(_TL("%d"),12);
	b=_TL("%d");
	a.Format(b,12);
	a.AppendFormat(b,12);
	Test1List(&a,&b,12);

	test.Next(_L("Replacing"));
	a=_TL("AAC");
	b=_TL("B");
	a.Replace(1,1,b);
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test2()
// Tests all constructors.
	{
	test.Start(_L("Default"));
	T a;
	test(a.MaxLength()==iMaxBufLength);
	test(a.Length()==0);

	test.Next(_L("By length"));
	T b(iMaxBufLength>>1);
	test(b.MaxLength()==iMaxBufLength);
	test(b.Length()==(iMaxBufLength>>1));

	test.Next(_L("By string"));
	T c(_TL("AB"));
	test(c.MaxLength()==iMaxBufLength);
	test(c.Length()==2);
	test(c[0]=='A');
	test(c[1]=='B');

	test.Next(_L("By buffer reference"));
	T d(c);
	test(d.MaxLength()==iMaxBufLength);
	test(d.Length()==2);
	test(d[0]=='A');
	test(d[1]=='B');
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test3()
// Tests all assignment operators
	{
	test.Start(_L("By String"));
	T a;
	a=_TL("AB");
	a+=_TL("CD");
	test(a.Length()==4);
	test(a==_TL("ABCD"));

	test.Next(_L("By buffer"));
	T b;
	b=a;
	b+=a;
	test(b.Length()==8);
	test(b==_TL("ABCDABCD"));
//	
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test4()
// Test all comparison operators
	{
	test.Start(_L("By NULL string"));
	T a;
	test(a==_TL(""));		// NULL strings
	test(!(a!=_TL("")));
	test(a<=_TL(""));
	test(a>=_TL(""));
	test(!(a<_TL("")));
	test(!(a>_TL("")));
	test(_TL("")==a);
	test(!(_TL("")!=a));
	test(_TL("")<=a);
	test(_TL("")>=a);
	test(!(_TL("")<a));
	test(!(_TL("")>a));

	test.Next(_L("By string or buffer"));
	a=_TL("abc");
	test(a==_TL("abc"));		// ==
	test(!(a==_TL("xyz")));
	test(!(a==_TL("aa")));
	test(_TL("abc")==a);
	test(!(_TL("xyz")==a));
	test(!(_TL("aa")==a));
	test(a!=_TL("xyz"));		// !=
	test(!(a!=_TL("abc")));
	test(a!=_TL("aa"));
	test(_TL("xyz")!=a);
	test(!(_TL("abc")!=a));
	test(_TL("aa")!=a);
	test(a<_TL("x"));			// <
	test(!(a<_TL("abc")));
	test(!(a<_TL("aa")));
	test(_TL("aa")<a);
	test(!(_TL("abc")<a));
	test(!(_TL("xyz")<a));
	test(a>_TL("aa"));			// >
	test(!(a>_TL("abc")));
	test(!(a>_TL("xyz")));
	test(_TL("xyz")>a);
	test(!(_TL("abc")>a));
	test(!(_TL("aa")>a));
	test(a>=_TL("abc"));		// >=
	test(!(a>=_TL("xyz")));
	test(a>=_TL("aa"));
	test(_TL("abc")>=a);
	test(!(_TL("aaa")>=a));
	test(_TL("xyz")>=a);
	test(a<=_TL("abc"));		// <=
	test(!(a<=_TL("aa")));
	test(a<=_TL("xyz"));
	test(_TL("abc")<=a);
	test(!(_TL("xyz")<=a));
	test(_TL("aa")<=a);

	test.Next(_L("By special characters"));
	a=_TL("!@#$%^&*()");
	test(a==_TL("!@#$%^&*()"));
	test.End();	
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test5()
// Test all property access
	{
	test.Start(_L("Length and Size"));
	T a;
	TInt maxLength=a.MaxLength();
    TInt i;
	for (i=0;i<maxLength;i++)
		{
		test(a.Length()==i);	// Length
		test(a.Size()==(TInt)(sizeof(S)*i)); // Size
		a.AppendNum(i%10);
		}
	const T b=a;
	for (i=0;i<maxLength;i++)
		{
		test(a[i]=='0'+(i%10));	// At
		test(b[i]=='0'+(i%10));	// AtConst
		}
	test(a[0]==*a.Ptr());	//Ptr
	a.SetLength(0);	// SetLength
	test(a.Length()==0);
	a.SetLength(maxLength-1);
	test(a.Length()==maxLength-1);
	a.Zero();	// Null
	test(a.Length()==0);
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test6()
// Fill and Swap
	{
	test.Start(_L("Fill and Swap"));
	T a,b;
	TChar chr;
	TInt j;
	TInt maxLength=a.MaxLength();
	for (TInt i=0;i<maxLength;i++)
		{
		chr=(i%10)+'0';
		a.SetLength(i);
		a.Fill(chr);	// Fill(TChar)
		b.Swap(a);
		test(b.Length()==i);	// Swap
		j=0;
		while (j<i)
			test(b[j++]=='0'+(i%10));
		b.FillZ();	// FillZ()
		a.Swap(b);
		j=0;
		while (j<i)
			test(a[j++]==0);
		a.Fill(chr,i);	// Fill(TChar,TUint)
		j=0;
		while (j<i)
			test(a[j++]=='0'+(i%10));
		a.FillZ(i);	// FillZ(TUint)
		j=0;
		while (j<i)
			test(a[j++]==0);
		}
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test7()
// Conversion operators
	{
	test.Start(_L("Fold, collate ..."));
	T a;
	T b;
	a=_TL("abc AbC");
	b=_TL("ABC ABC");
	a.Fold();
	b.Fold();
	test(a==b);
	a=_TL("abc AbC");
	b=_TL("ABC ABC");
	a.Collate();
	b.Collate();
	test(a==b);
	a.LowerCase();
	test(a==_TL("abc abc"));
	a.Capitalize();
	test(a==_TL("Abc abc"));
	a.UpperCase();
	test(a==_TL("ABC ABC"));
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test8()
// Comparison
	{
	test.Start(_L("By string"));
	T a;
	a=_TL("abc AbC");
	test(a.Compare(_TL("abc AbC"))==0);
	test(a.CompareF(_TL("ABC aBc"))==0);
	test(a.Compare(_TL("xyz"))!=0);
	test(a.CompareC(_TL("xyz"))!=0);
	test(a.CompareF(_TL("xyz"))!=0);

	test.Next(_L("By buffer"));
	T b;
	T c;
	a=_TL("abc AbC");
	b=_TL("abc AbC");
	c=_TL("xyz");
	test(a.Compare(b)==0);
	test(a.Compare(c)!=0);
	b=_TL("ABC aBc");
	test(a.CompareC(c)!=0);
	test(a.CompareF(b)==0);
	test(a.CompareF(c)!=0);

	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test9()
// Matching (need to test explicit result as error KErrNotFound = KMaxTUint
// 			 and so registers as TRUE. (test parameter is TUint) )
	{
	test.Start(_L("By string"));
	T a;
	a=_TL("abc AbC");
	test(a.Match(_TL("abc AbC"))==0);
	test(a.MatchC(_TL("ABC aBc"))==0);
	test(a.MatchF(_TL("ABC aBc"))==0);
	test(a.Match(_TL("xyz"))==KErrNotFound);
	test(a.MatchC(_TL("xyz"))==KErrNotFound);
	test(a.MatchF(_TL("xyz"))==KErrNotFound);

	test.Next(_L("By buffer"));
	T b;
	T c;
	a=_TL("abc AbC");
	b=_TL("abc AbC");
	c=_TL("xyz");
	test(a.Match(b)==0);
	test(a.Match(c)==KErrNotFound);
	b=_TL("ABC aBc");
	test(a.MatchC(b)==0);
	test(a.MatchC(c)==KErrNotFound);
	test(a.MatchF(b)==0);
	test(a.MatchF(c)==KErrNotFound);

	test.Next(_L("Wildcards"));
	a=_TL("abcxyz");
	test(a.Match(_TL("abc*"))==0);
	test(a.Match(_TL("abw*"))==KErrNotFound);
	a=_TL("abcdefg");
	test(a.Match(_TL("a*fg"))==0);
	test(a.Match(_TL("a*f"))==KErrNotFound);
	test(a.Match(_TL("abc*fgh"))==KErrNotFound);
	a=_TL("abcdef");
	test(a.Match(_TL("abc?ef"))==0);
	test(a.Match(_TL("abc?xf"))==KErrNotFound);

	a=_TL("a(01)");
	test(a.Match(_TL("*(01)"))==1);
	test(a.Match(_TL("?(01)"))==0);
	test(a.Match(_TL("?(*)"))==0);
	test(a.Match(_TL("?(**)"))==0);

	test(a.Match(_TL("?(\?\?)"))==0);
	test(a.Match(_TL("*(*)"))>=0);
	test(a.Match(_TL("*(0?)"))>=0);
	test(a.Match(_TL("a(\?\?)"))==0);
	test(a.Match(_TL("*(\?\?)"))>=0);

	test.Next(_L("wild cards with collated comparison"));
	a = _TL("abcdefghijkl");
	test(a.MatchC(_TL("abc*")) == 0);
	test(a.MatchC(_TL("abc")) == KErrNotFound);
	test(a.MatchC(_TL("xyz")) == KErrNotFound);
	test(a.MatchC(_TL("*def")) == KErrNotFound);
	test(a.MatchC(_TL("*def*")) == 3);
	test(a.MatchC(_TL("*d?f*")) == 3);
	test(a.MatchC(_TL("a*kl")) == 0);
	test(a.MatchC(_TL("*e*?l")) == 4);
	test(a.MatchC(_TL("abc*dEf*")) == 0);
	
	
	T candidate;
	T search;
	
	candidate = _TL("");
	search = _TL("**");
	test(candidate.MatchC(search) == 0);
	
	candidate = _TL("");
	search = _TL("*");
	test(candidate.MatchC(search) == 0);
	
	candidate = _TL("abcd");
	search = _TL("*abc*cd");
	test(candidate.MatchC(search) == KErrNotFound);
   	
	if (sizeof(S) == 2)
		{
		test.Next(_L("Unicode MatchC and FindC treat base+accent as equal to composed character"));
		TPtrC p = _L("te\x302te");
		test(p.MatchC(_L("t\xeate")) == 0);
		test(p.FindC(_L("t\xeate")) == 0);
		}

	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test10()
// Locating
	{
	T a;
	TChar b;

	test.Start(_L("First Char"));
	b='a';
	a=_TL("axaxa");
	test(a.Locate(b)==0);
	test(a.LocateF(b)==0);
	test(a.LocateReverse(b)==4);
	test(a.LocateReverseF(b)==4);

	test.Next(_L("Middle Char"));
	a=_TL("xaxa");
	test(a.Locate(b)==1);
	test(a.LocateF(b)==1);
	a=_TL("axax");
	test(a.LocateReverse(b)==2);
	test(a.LocateReverseF(b)==2);

	test.Next(_L("Last Char"));
	a=_TL("xxa");
	test(a.Locate(b)==2);
	test(a.LocateF(b)==2);
	a=_TL("axx");
	test(a.LocateReverse(b)==0);
	test(a.LocateReverseF(b)==0);

	test.Next(_L("Test for failure of locate"));
	a=_TL("xxx");
	test(a.Locate(b)==KErrNotFound);
	test(a.LocateF(b)==KErrNotFound);
	test(a.LocateReverse(b)==KErrNotFound);
	test(a.LocateReverseF(b)==KErrNotFound);

	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test11()
// Copying
	{
	T a, b;
		
	test.Start(_L("By String"));
	a.Copy(_TL("abc"));
	test(a.Length()==3);
	test(a==_TL("abc"));
	a.CopyF(_TL("abc"));
	test(a.Length()==3);
	b.CopyF(_TL("ABC"));
	test(a==b);
	a.CopyLC(_TL("AbC"));
	test(a==_TL("abc"));
	test(a.Length()==3);
	a.CopyC(_TL("abc"));
	b.CopyC(_TL("ABC"));
	test(a==b);
	test(a.Length()==3);
	a.CopyCP(_TL("abc"));
	test(a==_TL("Abc"));
	test(a.Length()==3);
	a.CopyUC(_TL("aBc"));
	test(a==_TL("ABC"));
	test(a.Length()==3);
//	a.Copy(_TL("abc"),3);
//	test(a==_TL("abc"));
//	test(a.Length()==3);
//	a.Copy(_TL("abcd"),3);
//	test(a==_TL("abc"));
//	test(a.Length()==3);

	test.Next(_L("By buffer"));
	b=_TL("abc");
	a.Copy(b);
	test(a==_TL("abc"));
	test(a.Length()==3);
	a=_TL("");
	a.CopyF(b);
	b.CopyF(_TL("ABC"));
	test(a==b);
	test(a.Length()==3);
	a=_TL("");
	b=_TL("AbC");
	a.CopyLC(b);
	test(a==_TL("abc"));
	test(a.Length()==3);
	a=_TL("");
	b=_TL("abC");
	a.CopyC(b);
	b.CopyC(_TL("ABC"));
	test(a==b);
	test(a.Length()==3);
	a=_TL("");
	b=_TL("abC");
	a.CopyCP(b);
	test(a==_TL("Abc"));
	test(a.Length()==3);
	a=_TL("");
	b=_TL("aBc");
	a.CopyUC(b);
	test(a.Length()==3);
	test(a==_TL("ABC"));

	test.End();
	}


template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test12()
// Finding
	{
	test.Start(_L("By String"));
	T a,b;
	a=_TL("abccef");
	test(a.Find(_TL(""))==0);
	test(a.Find(_TL("abc"))==0);
	test(a.Find(_TL("cce"))==2);
	test(a.Find(_TL("cef"))==3);
	test(a.Find(_TL("efg"))==KErrNotFound);
	test(a.Find(_TL("xxx"))==KErrNotFound);
	test(a.FindF(_TL(""))==0);
	test(a.FindF(_TL("AbC"))==0);
	test(a.FindF(_TL("CcE"))==2);
	test(a.FindF(_TL("CeF"))==3);
	test(a.FindF(_TL("efg"))==KErrNotFound);
	test(a.FindF(_TL("xxx"))==KErrNotFound);
	test(a.FindC(_TL(""))==0);
	test(a.FindC(_TL("aBc"))==0);
	test(a.FindC(_TL("cce"))==2);
	test(a.FindC(_TL("cEf"))==3);
	test(a.FindC(_TL("efg"))==KErrNotFound);
	test(a.FindC(_TL("xxx"))==KErrNotFound);

	test.Next(_L("By buffer"));
	test(a.Find(b)==0);
	test(a.FindF(b)==0);
	test(a.FindC(b)==0);
	b=_TL("xxx");
	test(a.Find(b)==KErrNotFound);
	test(a.FindF(b)==KErrNotFound);
	test(a.FindC(b)==KErrNotFound);
	b=_TL("efg");
	test(a.Find(b)==KErrNotFound);
	test(a.FindF(b)==KErrNotFound);
	test(a.FindC(b)==KErrNotFound);
	b=_TL("abc");
	test(a.Find(b)==0);
	b=_TL("cce");
	test(a.Find(b)==2);
	b=_TL("cef");
	test(a.Find(b)==3);
	b=_TL("AbC");
	test(a.FindF(b)==0);
	b=_TL("CcE");
	test(a.FindF(b)==2);
	b=_TL("CeF");
	test(a.FindF(b)==3);
	b=_TL("aBc");
	test(a.FindC(b)==0);
	b=_TL("cCe");
	test(a.FindC(b)==2);
	b=_TL("cEf");
	test(a.FindC(b)==3);

	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test13()
// Basic like ops
	{
	test.Start(_L("Repeat, trim, insert and delete"));
	T a,b;
	TInt max=a.MaxLength(); 
	b=_TL("abc");
	a.Repeat(_TL("abc"));
	test(a==_TL(""));
	a.Repeat(b);
	test(a==_TL(""));
	for (TInt j=1;j<max;j++) // ?? Cannot SetLength = MaxLength
		{
		a.SetLength(j);
		a.Repeat(_TL("abc"));
        TInt i;
		for (i=0;i<j;i++)
			test(a[i]==b[i%3]);
		a=_TL("");
		a.SetLength(j);
		a.Repeat(b);
		for (i=0;i<j;i++)
			test(a[i]==b[i%3]);
		a=_TL("");
		}
	a=_TL("\t\n  ab \t\n ");
	a.TrimLeft();
	test(a==_TL("ab \t\n "));
	test(a.Length()==6);
	a=_TL("\t\n  ab \t\n ");
	a.TrimRight();
	test(a==_TL("\t\n  ab"));
	test(a.Length()==6);
	a=_TL(" \t\n ab \t \n");
	a.Trim();
	test(a==_TL("ab"));
	a.Trim();
	test(a==_TL("ab"));
	a=_TL("abc");
	b=_TL("123");
	a.Insert(1,b);
	test(a==_TL("a123bc"));
	test(a.Length()==6);
	b=_TL("");
	a.Insert(4,b);
	test(a==_TL("a123bc"));
	test(a.Length()==6);
	a.Insert(0,b);
	test(a==_TL("a123bc"));
	test(a.Length()==6);
	a.Delete(1,3);
	test(a==_TL("abc"));
	test(a.Length()==3);
	a.Delete(0,3);
	test(a==_TL(""));
	test(a.Length()==0);

	test.Next(_L("TrimAll"));
	a=_TL("");
	a.TrimAll();
	test(a==_TL(""));
	a=_TL(" ");
	a.TrimAll();
	test(a==_TL(""));
	a=_TL("   ");
	a.TrimAll();
	test(a==_TL(""));
	a=_TL("    ab cd  ef    g");
	a.TrimAll();
	test(a==_TL("ab cd ef g"));
	a=_TL("abcdef");
	a.TrimAll();
	test(a==_TL("abcdef"));
	a=_TL("a  b\t cd\t\tef");
	a.TrimAll();
	test(a==_TL("a b\tcd\tef"));
	a=_TL("abcdef \t ghijk");
	a.TrimAll();
	test(a==_TL("abcdef ghijk"));
	a=_TL("abcdef g");
	a.TrimAll();
	test(a==_TL("abcdef g"));
	a=_TL("ab  cd  ef  gh  ij");
	a.TrimAll();
	test(a==_TL("ab cd ef gh ij"));
	a=_TL("a        b          c     defg h     i  jk l     mno pqr stu  vw   xyz");
	a.TrimAll();
	test(a==_TL("a b c defg h i jk l mno pqr stu vw xyz"));

	test.Next(_L("Right, Left and Mid"));
	a=_TL("abcdef");
	b = a.Left(3);
	test(b==_TL("abc"));
	test(b.Length()==3);
	b = a.Right(3);
	test(b==_TL("def"));
	b = a.Mid(2);
	test(b==_TL("cdef"));
	test(b.Length()==4);
	b = a.Left(2);
	test(b==_TL("ab"));
	test(b.Length()==2);
	b = a.Right(2);
	test(b==_TL("ef"));
	b = a.Mid(2,1);
	test(b==_TL("c"));
	test(b.Length()==1);
	b = a.Left(6);
	test(b==_TL("abcdef"));
	test(b.Length()==6);
	b=_TL("");
	b.SetLength(4);
	b = a.Right(6);
	test(b==_TL("abcdef"));
	test(b.Length()==6);
	a = a.Left(6);
	test(a==_TL("abcdef"));
	b=_TL("");
	b = a.Mid(0,6);
	test(b==_TL("abcdef")); 
	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test14()
// Formating operations
	{
	test.Start(_L("Justify"));
	T a,b,d;
	TInt aWidth;
	TChar c;
	a=_TL("wxyz");
	b=_TL("abc");
	d=_TL("linearisation");
	const S* pD=_TS("299792458");
	c='x';
	aWidth=KDefaultJustifyWidth; // Left justified, Default width
	a.Justify(b,aWidth,ELeft,c);
	test(a==b);
	test(a.Length()==3);
	a.AppendJustify(b,aWidth,ELeft,c);
	test(a==_TL("abcabc"));
	test(a.Length()==6);
	aWidth=1;	// Width < String length
	a.Justify(b,aWidth,ELeft,c);
	test(a==_TL("a"));
	test(a.Length()==1);
	a.AppendJustify(b,aWidth,ELeft,c);
	test(a==_TL("aa"));
	test(a.Length()==2);
	aWidth=5; // Width > String length
	a.Justify(b,aWidth,ELeft,c);
	test(a==_TL("abcxx"));
	test(a.Length()==5);
	a.AppendJustify(b,aWidth,ELeft,c);
	test(a==_TL("abcxxabcxx"));
	test(a.Length()==10);

	aWidth=KDefaultJustifyWidth; // Right justified, Default width
	a.Justify(b,aWidth,ERight,c);
	test(a==b);
	test(a.Length()==3);
	a.AppendJustify(b,aWidth,ERight,c);
	test(a==_TL("abcabc"));
	test(a.Length()==6);
	aWidth=1; // Right justified, Width < String length
	a.Justify(b,aWidth,ERight,c);
	test(a==_TL("a"));
	test(a.Length()==1);
	a.AppendJustify(b,aWidth,ERight,c);
	test(a==_TL("aa"));
	test(a.Length()==2);
	aWidth=5; // Right justified, width > String length
	a.Justify(b,aWidth,ERight,c);
	test(a==_TL("xxabc"));
	test(a.Length()==5);
	a.AppendJustify(b,aWidth,ERight,c);
	test(a==_TL("xxabcxxabc"));
	test(a.Length()==10);

	aWidth=KDefaultJustifyWidth; // Center justified, Default width
	a.Justify(b,aWidth,ECenter,c);
	test(a==b);
	test(a.Length()==3);
	a.AppendJustify(b,aWidth,ECenter,c);
	test(a==_TL("abcabc"));
	test(a.Length()==6);
	aWidth=1; // Centre justified, width < String length
	a.Justify(b,aWidth,ECenter,c);
	test(a==_TL("a"));
	test(a.Length()==1);
	a.AppendJustify(b,aWidth,ECenter,c);
	test(a==_TL("aa"));
	test(a.Length()==2);
	aWidth=5; // Centre justified, width > String length
	a.Justify(b,aWidth,ECenter,c);
	test(a==_TL("xabcx"));
	test(a.Length()==5);
	a.AppendJustify(b,aWidth,ECenter,c);
	test(a==_TL("xabcxxabcx"));
	test(a.Length()==10);

	test.Next(_L("Num"));
	TInt j=-2147483647-1; 
	a.Num(j);
	test(a==_TL("-2147483648"));
	test(a.Length()==11);
	TUint i=2147483648u;
	a.Num(i);
	test(a==_TL("2147483648"));
	test(a.Length()==10);
	if (a.MaxLength()>31)
		{
		a.Num(i,EBinary);
		test(a==_TL("10000000000000000000000000000000"));
		test(a.Length()==32);
		a=_TL("");
		a.NumUC(i,EBinary);
		test(a==_TL("10000000000000000000000000000000"));
		test(a.Length()==32);
		}
	i=31;
	a.Num(i,EBinary);
	test(a==_TL("11111"));
	test(a.Length()==5);
	a=_TL("");
	a.NumUC(i,EBinary);
	test(a==_TL("11111"));
	test(a.Length()==5);
	i=2147483648u;
	a.Num(i,EOctal);
	test(a==_TL("20000000000"));
	test(a.Length()==11);
	a=_TL("");
	a.NumUC(i,EOctal);
	test(a==_TL("20000000000"));
	test(a.Length()==11);
	a.Num(i,EDecimal);
	test(a==_TL("2147483648"));
	test(a.Length()==10);
	a=_TL("");
	a.NumUC(i,EDecimal);
	test(a==_TL("2147483648"));
	test(a.Length()==10);
	a.Num(i,EHex);
	test(a==_TL("80000000"));
	test(a.Length()==8);
	a=_TL("");
	a.NumUC(i,EHex);
	test(a==_TL("80000000"));
	test(a.Length()==8);
	i=0;
	a.Num(i);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("abc");
	a.Num(i,EBinary);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("abc");
	a.NumUC(i,EBinary);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("abc");
	a.Num(i,EOctal);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("");
	a.NumUC(i,EOctal);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("abc");
	a.Num(i,EDecimal);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("");
	a.NumUC(i,EDecimal);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("abc");
	a.Num(i,EHex);
	test(a==_TL("0"));
	test(a.Length()==1);
	a=_TL("");
	a.NumUC(i,EHex);
	test(a==_TL("0"));
	test(a.Length()==1);
//	TInt i=a.Num(6.2,format); NOT IMPLEMENTED
	a.AppendNum(j);
	test(a==_TL("0-2147483648"));
	test(a.Length()==12);
	a=_TL("abc");
	i=4294967295u;
	a.AppendNum(i);
	test(a==_TL("abc4294967295"));
	test(a.Length()==13);
	j=2147483647;
	a=_TL("abc");
	a.AppendNum(j);
	test(a==_TL("abc2147483647"));
	test(a.Length()==13);
	a=_TL("a");
	i=180150000;
	if (a.MaxLength()>28)
		{
		a.AppendNum(i,EBinary);
		test(a==_TL("a1010101111001101111011110000"));
		test(a.Length()==29);
		}
	a=_TL("a");
	a.AppendNum(15,EBinary);
	test(a==_TL("a1111"));
	test(a.Length()==5);
	a=_TL("a");
	a.AppendNum(i,EDecimal);
	test(a==_TL("a180150000"));
	test(a.Length()==10);
	a=_TL("a");
	a.AppendNum(i,EOctal);
	test(a==_TL("a1257157360"));
	test(a.Length()==11);
	a=_TL("a");
	a.AppendNumUC(i,EHex);
	test(a==_TL("aABCDEF0"));
	test(a.Length()==8);
//	i=a.AppendNum(6.32, format); NOT IMPLEMENTED

	test.Next(_L("Format"));
	a=_TL("");
	b=_TL("cde");
	a.Format(_TL("%S"),&b);
	test(a==b);
	test(a.Length()==3);
    DESTEMPLATE xyz=_TL("xyzwpq");
	a.Format(_TL("%S"),&xyz);
	test(a==_TL("xyzwpq"));
	test(a.Length()==6);
    DESTEMPLATE cde=_TL("cde");
	a.Format(_TL("ab %-x5S"),&cde);
	test(a==_TL("ab cdexx"));
	test(a.Length()==8);
	a.Format(_TL("ab %=x5S"),&cde);
	test(a==_TL("ab xcdex"));
	test(a.Length()==8);
	a.Format(_TL("ab %+x5S"),&cde);
	test(a==_TL("ab xxcde"));
	test(a.Length()==8);
	a.Format(_TL("ab %5S"),&cde);
	test(a==_TL("ab   cde"));
	test(a.Length()==8);
	a.Format(_TL("ab %-**S"),'x',5,&cde);
	test(a==_TL("ab cdexx"));
	test(a.Length()==8);
	a.Format(_TL("ab %*S"),5,&cde);
	test(a==_TL("ab   cde"));
	test(a.Length()==8);
	a=_TL("xyz");
	a.Format(_TL("ab %-x5S"),&b);
	test(a==_TL("ab cdexx"));
	test(a.Length()==8);
	a=_TL("xyz");
	a.Format(_TL("ab %-**S"),'x',5,&b);
	test(a==_TL("ab cdexx"));
	test(a.Length()==8);
	a=_TL("xyz");
	a.Format(_TL("ab %*S"),5,&b);
	test(a==_TL("ab   cde"));
	test(a.Length()==8);

	DESTEMPLATE fred=_TL("fred");
	a.Format(_TL("%+0*S"),10,&fred);
	test(a==_TL("000000fred"));
	test(a.Length()==10);
	a.Format(_TL("%-0*S"),7,&fred);
	test(a==_TL("fred000"));
	test(a.Length()==7);
	a.Format(_TL("%0*S"),11,&fred);
	test(a==_TL("0000000fred"));
	test(a.Length()==11);
	a.Format(_TL("c=%s"),pD);
	TESTEQ(a,_TL("c=299792458"));
	a.Format(_TL("c=%10.6s"),pD);
	test(a==_TL("c=    299792"));
	a.Format(_TL("c=%*.*s"),5,4,pD);
	test(a==_TL("c= 2997"));
	a.Format(_TL("%S"),&d);
	test(a==_TL("linearisation"));
	a.Format(_TL("%10.6S"),&d);
	test(a==_TL("    linear"));
	a.Format(_TL("%*.*S"),5,4,&d);
	test(a==_TL(" line"));
	a.Format(_TL("%*.*Sed"),10,8,&d);
	test(a==_TL("  linearised"));
	a.Format(_TL("%*.*S"),14,20,&d);
	test(a==_TL(" linearisation"));

	a.Format(_TL("ab %-,5b"),7);
	test(a==_TL("ab 111,,"));
	test(a.Length()==8);
	a.Format(_TL("ab %=,5O"),31);
	test(a==_TL("ab ,37,,"));
	test(a.Length()==8);
	a.Format(_TL("ab %+xlx"),TInt64(171));
	test(a==_TL("ab ab"));
	test(a.Length()==5);
	a.Format(_TL("ab %+xlX %+xlx"),TInt64(171),TInt64(171));
	TESTEQ(a,_TL("ab AB ab"));
	test(a.Length()==8);
	a.Format(_TL("ab %lu"),MAKE_TINT64((TUint)(KMinTInt),0));
	test(a==_TL("ab 9223372036854775808"));
	test(a.Length()==22);
	a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMinTInt),1));
	test(a==_TL("ab -9223372036854775807"));
	test(a.Length()==23);
	a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMinTInt),0));
	test(a==_TL("ab -9223372036854775808"));
	test(a.Length()==23);
	a.Format(_TL("ab %ld"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
	test(a==_TL("ab 9223372036854775807"));
	test(a.Length()==22);
	a.Format(_TL("ab %ld"),MAKE_TINT64(KMaxTUint,KMaxTUint));
	test(a==_TL("ab -1"));
	test(a.Length()==5);
	a.Format(_TL("ab %lu"),MAKE_TINT64(KMaxTUint,KMaxTUint));
	test(a==_TL("ab 18446744073709551615"));
	test(a.Length()==23);
	a.Format(_TL("ab %ld"),TInt64(0));
	test(a==_TL("ab 0"));
	test(a.Length()==4);
	a.Format(_TL("ab %lb"),TInt64(0));
	test(a==_TL("ab 0"));
	test(a.Length()==4);
	a.Format(_TL("ab %lx"),TInt64(0));
	test(a==_TL("ab 0"));
	test(a.Length()==4);
	a.Format(_TL("ab %lo"),TInt64(0));
	test(a==_TL("ab 0"));
	test(a.Length()==4);
	a.Format(_TL("ab %lu"),TInt64(0));
	test(a==_TL("ab 0"));
	test(a.Length()==4);
	a.Format(_TL("ab %lb"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
	test(a==_TL("ab 111111111111111111111111111111111111111111111111111111111111111"));
	test(a.Length()==66);
	a.Format(_TL("ab %lb"),MAKE_TINT64(KMaxTUint,KMaxTUint));
	test(a==_TL("ab 1111111111111111111111111111111111111111111111111111111111111111"));
	test(a.Length()==67);
	a.Format(_TL("ab %lx"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
	test(a==_TL("ab 7fffffffffffffff"));
	test(a.Length()==19);
	a.Format(_TL("ab %lx"),MAKE_TINT64(KMaxTUint,KMaxTUint));
	test(a==_TL("ab ffffffffffffffff"));
	test(a.Length()==19);
	a.Format(_TL("ab %lo"),MAKE_TINT64((TUint)(KMaxTInt),KMaxTUint));
	test(a==_TL("ab 777777777777777777777"));
	test(a.Length()==24);
	// tests which excercise any 8 byte alignment requirement on 64bit integers
	a.Format(_TL("%li%S"),MAKE_TINT64(1,2),&fred);
	test(a==_TL("4294967298fred"));
	a.Format(_TL("%S%li%S"),&fred,MAKE_TINT64(1,2),&fred);
	test(a==_TL("fred4294967298fred"));
	a.Format(_TL("%lu%S"),MAKE_TINT64(1,2),&fred);
	test(a==_TL("4294967298fred"));
	a.Format(_TL("%S%lu%S"),&fred,MAKE_TINT64(1,2),&fred);
	test(a==_TL("fred4294967298fred"));

	a.Format(_TL("ab %U"),233);
	test(a==_TL("ab 233"));
	test(a.Length()==6);
	a.Format(_TL("ab %*d"),5,-131);
	test(a==_TL("ab  -131"));
	test(a.Length()==8);
	a.Format(_TL("ab%c"),'x');
	test(a==_TL("abx"));
	test(a.Length()==3);
	a.Format(_TL("%W"),-131);
	test(*(TInt32*)a.Ptr()==-131);
	a.Format(_TL("%M"),-131);
	test(*(TInt32*)a.Ptr()==2113929215);
	a.Format(_TL("%w"),-131);
	test(*(TInt16*)a.Ptr()==-131);
	a.Format(_TL("%m"),-131);
	test(*(TInt16*)a.Ptr()==32255);
	a=_TL("xyz");
	a.AppendFormat(_TL("ab %+xlx"),TInt64(171));
	test(a==_TL("xyzab ab"));
	test(a.Length()==8);
	a=_TL("xyz");
	a.AppendFormat(_TL("ab %5S"),&b);
	test(a==_TL("xyzab   cde"));
	test(a.Length()==11);
	a=_TL("xyz");
	a.AppendFormat(_TL("%W"),-131);
//	test(*(TInt32*)(a.Ptr()+3)==-131); // Alignment-safe version:
    TInt val;
    Mem::Copy(&val,&a[3],4);
	test(val==-131);
	a=_TL("xyz");
//	a.Append(_TL("abc"),3);
//	test(a==_TL("xyzabc"));

	a.Format(_TL(""));
	test(a==_TL(""));
	a.Format(_TL(""),9,5);
	test(a==_TL(""));
	a.Format(_TL("qwerty"));
	test(a==_TL("qwerty"));
	a.Format(_TL("qwerty"),9,5);
	test(a==_TL("qwerty"));
	a.Format(_TL("%$1$d%$2$d"),9,5);
	test(a==_TL("95"));
	test(a.Length()==2);
	a.Format(_TL("%$2$d%$1$d"),9,5);
	test(a==_TL("59"));
	test(a.Length()==2);
	b=_TL("eb");
	a.Format(_TL("%$1$S%$2$d"),&b,205);
	test(a==_TL("eb205"));
	test(a.Length()==5);
	a.Format(_TL("%$2$d%$1$S"),&b,205);
	test(a==_TL("205eb"));
	test(a.Length()==5);
	b=_TL("ebdb");

// Cannot do this on GCC (X86) because of "Cannot pass objects of non-POD type through '...'. Call will abort at runtime".
#if !(defined(__GCC32__) && defined(__X86__))
	const TAny* const zeroTerminatedString=(sizeof(S)==2)? (const TAny*)_S16(":-)E"): (const TAny*)_S8(":-)E");
	const TInt dummyParameter=0;
	Test14_ReorderedParameterFormatting(dummyParameter, 0x20ac, 11, 3, 13.89543, zeroTerminatedString, '!', TInt64(199), 2, &b, 6, 30005, TRealX(0.125), 0x8bdd);
#endif

	test.Next(_L("Print some numbers"));
	TInt64 TI64 = MAKE_TINT64(0x101010u,0x10101010u);
	test.Printf(_L("    %%ld: %ld\n"),TI64);
	test.Printf(_L("    %%lu: %lu\n"),TI64);
	test.Printf(_L("    %%lx: %lx\n"),TI64);
	test.Printf(_L("    %%lb: %lb\n"),TI64);
	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
	TI64 = UI64LIT(0xabcdef12345678);
	test.Printf(_L("    %%ld: %ld\n"),TI64);
	test.Printf(_L("    %%lu: %lu\n"),TI64);
	test.Printf(_L("    %%lx: %lx\n"),TI64);
	test.Printf(_L("    %%lb: %lb\n"),TI64);
	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
	TI64 = UI64LIT(0x7fffffffffffffff);
	test.Printf(_L("    %%ld: %ld\n"),TI64);
	test.Printf(_L("    %%lu: %lu\n"),TI64);
	test.Printf(_L("    %%lx: %lx\n"),TI64);
	test.Printf(_L("    %%lb: %lb\n"),TI64);
	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
	TI64 = UI64LIT(0x8000000000000000);
	test.Printf(_L("    %%ld: %ld\n"),TI64);
	test.Printf(_L("    %%lu: %lu\n"),TI64);
	test.Printf(_L("    %%lx: %lx\n"),TI64);
	test.Printf(_L("    %%lb: %lb\n"),TI64);
	test.Printf(_L("    %%lo: %lo\n\n"),TI64);
	TI64 = UI64LIT(0xffffffffffffffff);
	test.Printf(_L("    %%ld: %ld\n"),TI64);
	test.Printf(_L("    %%lu: %lu\n"),TI64);
	test.Printf(_L("    %%lx: %lx\n"),TI64);
	test.Printf(_L("    %%lb: %lb\n"),TI64);
	test.Printf(_L("    %%lo: %lo\n\n"),TI64);

	test.Next(_L("Regression tests"));
	a.Format(_TL("[%-A4p]"));
	test(a==_TL("[AAAA]"));

	test.End();
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test14_ReorderedParameterFormatting(TInt aDummyParameter, ...)
	{
	VA_LIST parameterList;
	T generated;
	T expected;

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%-**.*fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%.3Fyyyyyyy%c"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeeeebrrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(generated.Length()-1)==expected);
	test(generated[generated.Length()-1]==(S)0x8bdd);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%$1$-**.*fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%$6$.3Fyyyyyyy%c"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeeeebrrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(generated.Length()-1)==expected);
	test(generated[generated.Length()-1]==(S)0x8bdd);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%$6$.3Fqq%.3swww%+*5Ldeeee%.*Srrrrr%0*xtttttt%$1$-**.*fyyyyyyy%c"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\t0.125qq:-)www!!199eeeeebrrrrr007535tttttt13.895%c%c%c%c%cyyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(generated.Length()-1)==expected);
	test(generated[generated.Length()-1]==(S)0x8bdd);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%-**.*fqq%.3swww%$5$0*xeeee%.*Srrrrr%$3$+*5Ldtttttt%.3Fyyyyyyy%c"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www007535eeeeebrrrrr!!199tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(generated.Length()-1)==expected);
	test(generated[generated.Length()-1]==(S)0x8bdd);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%-**.*fqq%$4$.*Swww%+*5Ldeeee%$2$.3srrrrr%0*xtttttt%.3Fyyyyyyy%c"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\t13.895%c%c%c%c%cqqebwww!!199eeee:-)rrrrr007535tttttt0.125yyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(generated.Length()-1)==expected);
	test(generated[generated.Length()-1]==(S)0x8bdd);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%-**.*fqq%.3swww%+*5Ldeeee%$7$crrrrr%0*xtttttt%.3Fyyyyyyy%$4$.*S"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\t13.895%c%c%c%c%cqq:-)www!!199eeee"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(29)==expected);
	test(generated[29]==(S)0x8bdd);
	test(generated.Mid(29+1)==_TL("rrrrr007535tttttt0.125yyyyyyyeb"));

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%$4$.*Sqq%.3swww%+*5Ldeeee%$6$.3Frrrrr%0*xtttttt%$1$-**.*fyyyyyyy%c"), parameterList);
	test(generated.Length()==61);
	expected.Format(_TL("\tebqq:-)www!!199eeee0.125rrrrr007535tttttt13.895%c%c%c%c%cyyyyyyy"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Left(generated.Length()-1)==expected);
	test(generated[generated.Length()-1]==(S)0x8bdd);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%$7$cqq%$6$.3Fwww%$5$0*xeeee%.*Srrrrr%$3$+*5Ldtttttt%$2$.3syyyyyyy%$1$-**.*f"), parameterList);
	test(generated.Length()==61);
	test(generated.Left(1)==_TL("\t"));
	test(generated[1]==(S)0x8bdd);
	expected.Format(_TL("qq0.125www007535eeeeebrrrrr!!199tttttt:-)yyyyyyy13.895%c%c%c%c%c"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Mid(2)==expected);

	VA_START(parameterList, aDummyParameter);
	generated.FormatList(_TL("\t%$7$cqq%$6$.3Fwww%$5$0*xeeee%$4$.*Srrrrr%$3$+*5Ldtttttt%$2$.3syyyyyyy%$1$-**.*f"), parameterList);
	test(generated.Length()==61);
	test(generated.Left(1)==_TL("\t"));
	test(generated[1]==(S)0x8bdd);
	expected.Format(_TL("qq0.125www007535eeeeebrrrrr!!199tttttt:-)yyyyyyy13.895%c%c%c%c%c"), (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac, (S)0x20ac);
	test(generated.Mid(2)==expected);
	}

template <class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::Test15()
// Replacing
	{
	test.Start(_L("Replace"));
	T a,b;
	test(a.MaxLength()>=9);
	a=_TL("abccccc");
	b=_TL("def");
	a.Replace(3,4,b); // Replace with smaller in middle (insert and delete)
	test(a==_TL("abcdef"));
	a.Replace(1,1,b); // Replace with larger in middle (insert and delete)
	test(a==_TL("adefcdef"));
	a.Replace(0,8,_TL("")); // Replace complete string (delete)
	test(a==_TL(""));
	a.Replace(0,0,b); // Replace at beginning (insert)
	test(a==b);
	a.Replace(3,0,_TL("xyz")); // Replace at end (append)
	test(a==_TL("defxyz"));
	a.Replace(0,0,_TL("")); // Replace nothing at beginning (do nothing)
	test(a==_TL("defxyz"));
	a.Replace(6,0,_TL("")); // Replace nothing at end (do nothing)
	test(a==_TL("defxyz"));
	//a.Replace(6,1,_TL("")); // this will panic - no char after end to replace
	//a.Replace(0,7,_TL("")); // this will panic - aint 7 chars to replace
	test.End();
	}

template<class T,class S,class DESTEMPLATE>
GLDEF_C void TestTBuf<T,S,DESTEMPLATE>::test_TBuf()
// Test the TBuf class.
	{
	test.Start(_L("All operations"));
	Test1();
	test.Next(_L("Constructors"));
	Test2();
	test.Next(_L("Additional tests"));
	Test3();
	test.Next(_L("Comparison operators"));
	Test4();
	test.Next(_L("Property access"));
	Test5();
	test.Next(_L("Fill and swap"));
	Test6();
	test.Next(_L("Conversion operators"));
	Test7();
	test.Next(_L("Comparison"));
	Test8();
	test.Next(_L("Matching"));
	Test9();
	test.Next(_L("Locating"));
	Test10();
	test.Next(_L("Copying"));
	Test11();
	test.Next(_L("Finding"));
	Test12();
	test.Next(_L("Basic like ops"));
	Test13();
	test.Next(_L("Formating"));
	Test14();
	test.Next(_L("Replacing"));
	Test15();
	test.End();
	}

LOCAL_C void testFormat()
	{
	TBuf<0x100> aa;
	aa.Format(_L("x%- 5fx"), 6.2345678);
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x%+ 5fx"), 6.2345678);
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x% 5fx"), 6.2345678);
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x%= 5fx"), 6.2345678);
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x%- 10fx"), 6.2345);
	test(aa==_L("x6.234500  x"));
	aa.Format(_L("x%+ 10fx"), 6.2345);
	test(aa==_L("x  6.234500x"));
	aa.Format(_L("x% 10fx"), 6.2345);
	test(aa==_L("x  6.234500x"));
	aa.Format(_L("x%= 10fx"), 6.2345);
	test(aa==_L("x 6.234500 x"));
	aa.Format(_L("x%10fx"), 12345352342.545);
	test(aa==_L("x12,345,352,342.545000x"));
	aa.Format(_L("x%20.9fx"), 1.0123456789);
	test(aa==_L("x         1.012345679x"));
	aa.Format(_L("x%5.1fx"), 1.99);
	test(aa==_L("x  2.0x"));

// Cannot do these on GCC (X86) because of "Cannot pass objects of non-POD type through '...'. Call will abort at runtime".
#if !(defined(__GCC32__) && defined(__X86__))
	aa.Format(_L("x%- 5Fx"), TRealX(6.2345678));
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x%+ 5Fx"), TRealX(6.2345678));
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x% 5Fx"), TRealX(6.2345678));
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x%= 5Fx"), TRealX(6.2345678));
	test(aa==_L("x6.234568x"));
	aa.Format(_L("x%- 10Fx"), TRealX(6.2345));
	test(aa==_L("x6.234500  x"));
	aa.Format(_L("x%+ 10Fx"), TRealX(6.2345));
	test(aa==_L("x  6.234500x"));
	aa.Format(_L("x% 10Fx"), TRealX(6.2345));
	test(aa==_L("x  6.234500x"));
	aa.Format(_L("x%+010Fx"), TRealX(6.2345));
	test(aa==_L("x006.234500x"));
	aa.Format(_L("x%+10Fx"), TRealX(6.2345));
	test(aa==_L("x  6.234500x"));
	aa.Format(_L("x%10Fx"), TRealX(6.2345));
	test(aa==_L("x  6.234500x"));
	aa.Format(_L("x%010Fx"), TRealX(6.2345));
	test(aa==_L("x006.234500x"));
	aa.Format(_L("x%= 10Fx"), TRealX(6.2345));
	test(aa==_L("x 6.234500 x"));
	aa.Format(_L("x%10Fx"), TRealX(12345352342.545));
	test(aa==_L("x12,345,352,342.545000x"));
	aa.Format(_L("x%20.9Fx"), TRealX(1.0123456789));
	test(aa==_L("x         1.012345679x"));
	aa.Format(_L("x%5.1Fx"), TRealX(1.99));
	test(aa==_L("x  2.0x"));
#endif

	aa.Format(_L("x%- 5ex"), 6.2345678);
	test(aa==_L("x6.234568E+00x"));
	aa.Format(_L("x%+ 5ex"), 6.2345678);
	test(aa==_L("x6.234568E+00x"));
	aa.Format(_L("x% 5ex"), 6.2345678);
	test(aa==_L("x6.234568E+00x"));
	aa.Format(_L("x%= 5ex"), 6.2345678);
	test(aa==_L("x6.234568E+00x"));
	aa.Format(_L("x%- 14ex"), 6.2345);
	test(aa==_L("x6.234500E+00  x"));
	aa.Format(_L("x%+ 14ex"), 6.2345);
	test(aa==_L("x  6.234500E+00x"));
	aa.Format(_L("x% 14ex"), 6.2345);
	test(aa==_L("x  6.234500E+00x"));
	aa.Format(_L("x%= 14ex"), 6.2345);
	test(aa==_L("x 6.234500E+00 x"));
	aa.Format(_L("x%10ex"), 12345352342.545);
	test(aa==_L("x1.234535E+10x"));
	aa.Format(_L("x%20.9ex"), 1.0123456789);
	test(aa==_L("x     1.012345679E+00x"));
	aa.Format(_L("x%5.1ex"), 1.99);
	test(aa==_L("x2.0E+00x"));
	}


class TO8 : public TDes8Overflow
	{
public:
	virtual void Overflow(TDes8 &aDes);
	};

void TO8::Overflow(TDes8 &aDes)
	{
	aDes=_L8("OVERFLOW");
	}

class TO8L : public TDes8Overflow
	{
public:
	virtual void Overflow(TDes8 &aDes);
	};

void TO8L::Overflow(TDes8 &/*aDes*/)
	{
	User::Leave(KErrOverflow);
	}

class TO16 : public TDes16Overflow
	{
public:
	virtual void Overflow(TDes16 &aDes);
	};

void TO16::Overflow(TDes16 &aDes)
	{
	aDes=_L16("OVERFLOW");
	}

class TO16L : public TDes16Overflow
	{
public:
	virtual void Overflow(TDes16 &aDes);
	};

void TO16L::Overflow(TDes16 &/*aDes*/)
	{
	User::Leave(KErrOverflow);
	}

void append8(TDes8 &aBuf, TDes8Overflow *aHandler, TRefByValue<const TDesC8> aFmt, ...)
	{
	VA_LIST list;
	VA_START(list, aFmt);
	aBuf.AppendFormatList(aFmt, list, aHandler);
	}

void append16(TDes16 &aBuf, TDes16Overflow *aHandler, TRefByValue<const TDesC16> aFmt, ...)
	{
	VA_LIST list;
	VA_START(list, aFmt);
	aBuf.AppendFormatList(aFmt, list, aHandler);
	}

void testOverflow()
	{
	test.Start(_L("Test no overflow"));
	TBuf8<16> buf=_L8("A ");
	append8(buf, NULL, _L8("Descriptor"));
	test(buf==_L8("A Descriptor"));

	test.Printf(_L("Use a non-leaving overflow handler\n"));
	test.Next(_L("Force overflow with no conversions"));
    TO8 overflow;
	append8(buf, &overflow, _L8("12345678901234567"));
	test(buf==_L8("OVERFLOW"));

	test.Next(_L("Force overflow with decimal conversion"));
	buf=_L8("A Descriptor");
	append8(buf, &overflow,  _L8("%d"), 12345678);
	test(buf==_L8("OVERFLOW"));

	test.Printf(_L("Use a leaving overflow handler\n"));
	test.Next(_L("AppendFormatList with no overflow"));
	buf=_L8("A Descriptor");
    TO8L overflowLeave;
	TRAPD(r, append8(buf, &overflowLeave, _L8("ONE")));
	test(r==KErrNone);
	test(buf==_L8("A DescriptorONE"));
	test.Next(_L("Force overflow with hexadecimal conversion"));
	buf=_L8("A Descriptor");
	TRAP(r, append8(buf, &overflowLeave, _L8("%08x"), 0));
	test(r==KErrOverflow);
		{
		test.Printf(_L("Repeat tests with TBuf16\n"));
		test.Next(_L("Test no overflow"));
		TBuf16<16> buf=_L16("A ");
		append16(buf, NULL, _L16("Descriptor"));
		test(buf==_L16("A Descriptor"));

		test.Printf(_L("Use a non-leaving overflow handler\n"));
		test.Next(_L("Force overflow with no conversions"));
		TO16 overflow;
		append16(buf, &overflow, _L16("12345678901234567"));
		test(buf==_L16("OVERFLOW"));

		test.Next(_L("Force overflow with decimal conversion"));
		buf=_L16("A Descriptor");
		append16(buf, &overflow,  _L16("%d"), 12345678);
		test(buf==_L16("OVERFLOW"));

		test.Printf(_L("Use a leaving overflow handler\n"));
		test.Next(_L("AppendFormatList with no overflow"));
		buf=_L16("A Descriptor");
		TO16L overflowLeave;
		TRAPD(r, append16(buf, &overflowLeave, _L16("ONE")));
		test(r==KErrNone);
		test(buf==_L16("A DescriptorONE"));
		test.Next(_L("Force overflow with hexadecimal conversion"));
		buf=_L16("A Descriptor");
		TRAP(r, append16(buf, &overflowLeave, _L16("%08x"), 0));
		test(r==KErrOverflow);
		}
	test.End();
	}

void testIgnoreOverflow()
	{
	test.Start(_L("Test no overflow"));
	TBuf8<16> buf=_L8("A ");
	append8(buf, NULL, _L8("Descriptor"));
	test(buf==_L8("A Descriptor"));

	test.Printf(_L("Use a non-leaving overflow handler\n"));
	test.Next(_L("Force overflow with no conversions"));
    TDes8IgnoreOverflow overflow;
	append8(buf, &overflow, _L8("12345678901234567"));
	test(buf==_L8("A Descriptor1234"));

	test.Next(_L("Force overflow with decimal conversion"));
	buf=_L8("A Descriptor");
	append8(buf, &overflow,  _L8("%d"), 123456789);
	test(buf==_L8("A Descriptor"));

	//test.Printf(_L("Repeat tests with TBuf16\n"));
	test.Next(_L("Test no overflow"));
	TBuf16<17> buf2=_L16("A ");
	append16(buf2, NULL, _L16("Descriptor"));
	test(buf2==_L16("A Descriptor"));

	test.Printf(_L("Use a non-leaving overflow handler\n"));
	test.Next(_L("Force overflow with no conversions"));
	TDes16IgnoreOverflow overflow2;
	append16(buf2, &overflow2, _L16("12345678901234567"));
	test(buf2==_L16("A Descriptor12345"));

	test.Next(_L("Force overflow with decimal conversion"));
	buf2=_L16("A Descriptor");
	append16(buf2, &overflow2,  _L16("%d"), 123456789);
	test(buf2==_L16("A Descriptor"));

	test.End();
	}

void testAppendFormatIgnoreOverflow()
	{
	test.Start(_L("Test no overflow"));
	TBuf8<16> buf;
	buf.AppendFormat(_L8("A Descriptor"));	
	test(buf==_L8("A Descriptor"));
	
	test.Next(_L("Force overflow with no conversions"));
    TDes8IgnoreOverflow overflow;
	buf.AppendFormat(_L8("123456789012345679"),&overflow);
	test(buf==_L8("A Descriptor1234"));
	
	test.Next(_L("Force overflow with decimal conversion"));
	buf = _L8("Symbian OS");
	buf.AppendFormat(_L8("%d"), &overflow, 1234567);
	test(buf==_L8("Symbian OS"));
	
	test.Next(_L("Test no overflow"));
	TBuf16<16> buf2;
	buf2.AppendFormat(_L16("A Descriptor"));	
	test(buf2==_L16("A Descriptor"));
	
	test.Next(_L("Force overflow with no conversions"));
    TDes16IgnoreOverflow overflow2;
	buf2.AppendFormat(_L16("123456789012345679"),&overflow2);
	test(buf2==_L16("A Descriptor1234"));
	
	test.Next(_L("Force overflow with decimal conversion"));
	buf2 = _L16("Symbian OS");
	buf2.AppendFormat(_L16("%d"), &overflow2, 1234567);
	test(buf2==_L16("Symbian OS"));

	test.End();


	}

// INC061330  AV28Crit: NTT - TInt TDesC16.FindC -method is giving strange output values 
// This test should pass with "ELangPrcChinese" locale.
void INC061330()
	{
	TLanguage defaultLang = User::Language();

	TInt err = HAL::Set(HAL::ELanguageIndex, ELangPrcChinese);
	test(err == KErrNone);	

	TBuf<50> libraryName;

	libraryName.Format(_L("ELOCL.%02d"), ELangPrcChinese);

	//Reset the locale
	err=UserSvr::ChangeLocale(KNullDesC);
	test(err==KErrNone);

	//Now change to chinese locale
	err = UserSvr::ChangeLocale(libraryName);
	if(err==KErrNotFound)
		{
		test.Printf(_L("TEST CASE NOT RUN BECAUSE ELangPrcChinese LOCALE NOT FOUND!\n"));
		HAL::Set(HAL::ELanguageIndex, defaultLang);
		return;
		}
	test(err == KErrNone);
	
	TLanguage lang = User::Language();
	test(lang == ELangPrcChinese);

	TInt pos;
	_LIT(KBuf, "hello");

	pos = KBuf().FindC(_L("a"));
	test(pos == KErrNotFound);

	pos = KBuf().FindC(_L("zzz"));
	test(pos == KErrNotFound);

	pos = KBuf().FindC(_L("."));
	test(pos == KErrNotFound);

	pos = KBuf().FindC(_L(":"));
	test(pos == KErrNotFound);

	pos = KBuf().FindC(_L("hela"));
	test(pos == KErrNotFound);

	//Reset the locale
	err=UserSvr::ChangeLocale(KNullDesC);
	test(err==KErrNone);
	
	//Now revert to the original default english locale
	libraryName.Format(_L("ELOCL.%02d"), defaultLang);
	test(err == KErrNone);
	err = UserSvr::ChangeLocale(libraryName);
	test(err == KErrNone);
	
	lang = User::Language();
	test(lang == defaultLang);
	}
#ifndef _DEBUG
#pragma warning( disable : 4702) //Unreachable code
#pragma warning( disable : 4710) //Function not expanded
#endif
GLDEF_C TInt E32Main()
// Test the TBuf type.
    {
	test.Title();

	test.Start(_L("class TBuf16<0x50>"));
	TestTBuf<TBuf16<0x50>,TText16,TPtrC16> c(0x50);
	c.test_TBuf();
	
	test.Next(_L("class TBuf8<0x50>"));
	TestTBuf<TBuf8<0x50>,TText8,TPtrC8> b(0x50);
	b.test_TBuf();
	
	test.Next(_L("class TBuf<0x50>"));
	TestTBuf<TBuf<0x50>,TText,TPtrC> a(0x50);
	a.test_TBuf();

	test.Next(_L("TReal formating"));
	testFormat();

	test.Next(_L("Test overflow handler"));
	testOverflow();

	test.Next(_L("Test ignore overflow handler"));
	testIgnoreOverflow();

	test.Next(_L("Test Format ignore overflow handler"));
	testAppendFormatIgnoreOverflow();

	test.Next(_L("INC061330"));
	INC061330();

	test.End();

	return(KErrNone);
    }

//#pragma warning( default : 4702)
//#pragma warning( default : 4710)