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)