textrendering/texthandling/tfields/T_FIELD1.CPP
changeset 0 1fb32624e06b
child 16 748ec5531811
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/texthandling/tfields/T_FIELD1.CPP	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,641 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: 
+*
+*/
+
+
+#include <e32test.h>
+#include "TESTFAC.H"
+#include <fldset.h>
+#include <flddef.h>
+
+#define UNUSED_VAR(a) a = a
+
+const TInt KTestCleanupStack=0x40;
+
+LOCAL_D RTest test(_L("Testing Fields"));
+LOCAL_D CTrapCleanup* TheTrapCleanup;
+LOCAL_D CTextFieldSet* TheFieldSet;
+LOCAL_D TTestFieldFactory* TheFactory;
+
+
+LOCAL_C TBool UpdateField(TInt aPos)
+	{
+	// find out which field aPos is in
+	TFindFieldInfo info;
+	TBool inField=TheFieldSet->FindFields(info,aPos);
+		test(inField);
+	// get the new value
+	HBufC* buf = HBufC::NewLC(5); 
+ 	TInt ret=TheFieldSet->NewFieldValueL(buf,aPos); 
+	CleanupStack::Pop();
+	CleanupStack::PushL(buf);
+		test(ret==KErrNone);
+	// Notify FieldSet of update
+	TheFieldSet->NotifyFieldUpdate(aPos,buf->Length());
+	// tidy up
+	CleanupStack::PopAndDestroy();
+	return ret;
+	}
+
+
+LOCAL_C void test1()
+// Tests that all CTextFieldSet methods exist as specced
+//
+	{
+	test.Next(_L("- Testing that all CTextFieldSet methods exist"));
+	// inform TheFieldSet about an imaginary insertion, then an imaginary deletion
+	TheFieldSet->NotifyInsertion(0,10); // pos=0, len=10
+	TheFieldSet->NotifyDeletion(2,5); // pos=2, len=5
+	// insert a field & get its initial value
+	CTextField* field = TheFieldSet->NewFieldL(KDummyFieldUid);
+	TInt ret = TheFieldSet->InsertFieldL(1,field,KDummyFieldUid); // pos=1
+		test(ret==KErrNone);
+	HBufC* buf = HBufC::NewLC(20); // max length 20
+	TheFieldSet->NewFieldValueL(buf,1); // pos=1
+	CleanupStack::Pop();
+	CleanupStack::PushL(buf);
+	TheFieldSet->NotifyFieldUpdate(1,buf->Length());
+	CleanupStack::PopAndDestroy(); // buf
+	// count number of fields & characters
+	TheFieldSet->FieldCount();
+	TheFieldSet->CharCount();
+	// find the inserted field
+	TheFieldSet->FindFields(0); // pos=0
+	TFindFieldInfo info;
+	TheFieldSet->FindFields(info,0,3); // pos=0, range=3
+	// remove the field
+	TheFieldSet->RemoveField(2);
+	// reset the field array
+	TheFieldSet->Reset();
+	}
+
+
+LOCAL_C void test2()
+// Tests inserting, updating and removing a field
+//
+	{
+	test.Next(_L("- Testing field insertion, update and removal"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// insert a field
+	CTextField* field = TheFieldSet->NewFieldL(KDummyFieldUid);
+	TInt ret=TheFieldSet->InsertFieldL(0,field,KDummyFieldUid); // pos=0
+		test(ret==KErrNone);
+	test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==1);
+	// get its initial value
+	ret=UpdateField(0);
+		test(ret==KErrNone);
+		test(TheFieldSet->CharCount()==3);
+		test(TheFieldSet->FieldCount()==1);
+	// get its value in a buffer of insufficient size
+	HBufC* miniBuf = HBufC::NewLC(0); 
+	ret=TheFieldSet->NewFieldValueL(miniBuf,0); // pos=0
+	CleanupStack::Pop();
+	CleanupStack::PushL(miniBuf);
+		test(ret==KErrNone);
+	// delete part of the field & update
+	TheFieldSet->NotifyDeletion(1,1); // pos=1, len=1
+		test(TheFieldSet->CharCount()==2);
+		test(TheFieldSet->FieldCount()==1);
+	ret=UpdateField(0);
+		test(TheFieldSet->CharCount()==3);
+		test(TheFieldSet->FieldCount()==1);
+	// delete over a zero length
+	TheFieldSet->NotifyDeletion(1,0); // pos=1, len=0
+		test(TheFieldSet->CharCount()==3);
+		test(TheFieldSet->FieldCount()==1);
+	TFindFieldInfo info;
+	TBool inField=TheFieldSet->FindFields(info,0);
+		test(inField);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==0);
+	// delete all the contents of the field & update
+	TheFieldSet->NotifyDeletion(0,3); // pos=0, len=3
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+/*	ret=UpdateField(0);
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	ret=TheFieldSet->RemoveField(0); // pos=0
+		test(ret);
+		test(TheFieldSet->CharCount()==3);
+		test(TheFieldSet->FieldCount()==0);
+*/	// reset the field array
+	TheFieldSet->Reset();
+	CleanupStack::PopAndDestroy(); // miniBuf
+	}
+
+
+LOCAL_C void test3()
+// Tests InField() in "all" the oddball situations
+//
+	{
+	TFindFieldInfo info;
+	test.Next(_L("- Testing InField() calls"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// Zero length doc
+	TBool inField=TheFieldSet->FindFields(info,0);
+		test(!inField);
+		test(info.iFieldCountInRange==0);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==0);
+	// Insert field (zero length) & test before
+	CTextField* field = TheFieldSet->NewFieldL(KDummyFieldUid);
+	TInt ret=TheFieldSet->InsertFieldL(0,field,KDummyFieldUid); // pos=0
+		test(ret==KErrNone);
+	inField=TheFieldSet->FindFields(info,0);
+		test(inField);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==0);
+	// Insert another field (zero length) & test before
+	CTextField* field2 = TheFieldSet->NewFieldL(KDummyFieldUid);
+	ret=TheFieldSet->InsertFieldL(0,field2,KDummyFieldUid); // pos=0
+		test(ret==KErrNone);
+	inField=TheFieldSet->FindFields(info,0);
+		test(inField);
+		test(info.iFieldCountInRange==2);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==0);
+	// Get the value of the first field, test before & test between them
+	ret=UpdateField(0);
+		test(ret==KErrNone);
+	inField=TheFieldSet->FindFields(info,0);
+		test(inField);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==0);
+	inField=TheFieldSet->FindFields(info,3);
+		test(inField);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==3);
+	// Get the value of the second field, test between them
+	ret=UpdateField(3);
+		test(ret==KErrNone);
+	inField=TheFieldSet->FindFields(info,3);
+		test(inField);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==3);
+	// end of doc - after field
+	inField=TheFieldSet->FindFields(info,6);
+		test(!inField);
+		test(info.iFieldCountInRange==0);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==0);
+	// In field
+	inField=TheFieldSet->FindFields(info,2);
+		test(inField);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==0);
+	// Other method at same pos
+	inField=TheFieldSet->FindFields(2);
+		test(inField);
+	// Pretend to insert some text between the fields
+	TheFieldSet->NotifyInsertion(3,5); // pos=3, len=5
+		test(TheFieldSet->CharCount()==11);
+		test(TheFieldSet->FieldCount()==2);
+	// Test in text
+	inField=TheFieldSet->FindFields(info,6);
+		test(info.iFieldCountInRange==0);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==0);
+	// Test from field to field over the intervening text
+	inField=TheFieldSet->FindFields(info,1,9);
+		test(info.iFieldCountInRange==2);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==0);
+	// Test from field 1 up to field 2
+	inField=TheFieldSet->FindFields(info,0,8);
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==0);
+	TheFieldSet->Reset();
+	}
+
+
+LOCAL_C void test4()
+// Tests Insertion and deletion of text around and into fields
+//
+	{
+	TFindFieldInfo info;
+	test.Next(_L("- Testing insertion and deletion of text around and into fields"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// Insert some text
+	TheFieldSet->NotifyInsertion(0,4); // pos=0, len=4
+		test(TheFieldSet->CharCount()==4);
+		test(TheFieldSet->FieldCount()==0);
+	// Insert some text into the text
+	TheFieldSet->NotifyInsertion(2,6); // pos=2, len=6
+		test(TheFieldSet->CharCount()==10);
+		test(TheFieldSet->FieldCount()==0);
+	// Insert a field into the text
+	CTextField* field = TheFieldSet->NewFieldL(KDummyFieldUid);
+	TInt ret=TheFieldSet->InsertFieldL(4,field,KDummyFieldUid); // pos=4
+	if(ret != KErrNone && field !=NULL)
+		{
+		delete field;
+		field = NULL;
+		}
+		test(ret==KErrNone);
+	ret=UpdateField(4);
+		test(ret==KErrNone);
+		test(TheFieldSet->CharCount()==13);
+		test(TheFieldSet->FieldCount()==1);
+	// Insert some text directly before the field (check it hasn't inserted into the field)
+	TheFieldSet->NotifyInsertion(4,2); // pos=4, len=2
+		test(TheFieldSet->CharCount()==15);
+		test(TheFieldSet->FieldCount()==1);
+	TBool inField=TheFieldSet->FindFields(info,7); // pos=7
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==6);
+	// Insert some text directly after the field
+	TheFieldSet->NotifyInsertion(9,1); // pos=9, len=1
+		test(TheFieldSet->CharCount()==16);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,7); // pos=7
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==6);
+	// Insert some text into the field
+	TheFieldSet->NotifyInsertion(7,4); // pos=9, len=4
+		test(TheFieldSet->CharCount()==20);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,7); // pos=7
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==7);
+		test(info.iFirstFieldPos==6);
+	// Delete some text directly after the field
+	TheFieldSet->NotifyDeletion(13,1); // pos=13, len=1
+		test(TheFieldSet->CharCount()==19);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,9); // pos=9
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==7);
+		test(info.iFirstFieldPos==6);
+	// Delete some text before the field
+	TheFieldSet->NotifyDeletion(4,2); // pos=4, len=2
+		test(TheFieldSet->CharCount()==17);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,7); // pos=7
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==7);
+		test(info.iFirstFieldPos==4);
+	// Delete some text overlapping into the field
+	TheFieldSet->NotifyDeletion(1,5); // pos=1, len=5
+		test(TheFieldSet->CharCount()==12);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,3); // pos=3
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==5);
+		test(info.iFirstFieldPos==1);
+	// Delete some text overlapping out of the field
+	TheFieldSet->NotifyDeletion(3,4); // pos=3, len=4
+		test(TheFieldSet->CharCount()==8);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,2); // pos=2
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==2);
+		test(info.iFirstFieldPos==1);
+	// Delete all text, inc field
+	TheFieldSet->NotifyDeletion(0,8); // pos=0, len=8
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+		
+	//Adding some character & field at the end & then deleting all
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// Insert some text
+	TheFieldSet->NotifyInsertion(0,4); // pos=0, len=4
+		test(TheFieldSet->CharCount()==4);
+		test(TheFieldSet->FieldCount()==0);
+	// Insert some text into the text
+	TheFieldSet->NotifyInsertion(2,7); // pos=2, len=7
+		test(TheFieldSet->CharCount()==11);
+		test(TheFieldSet->FieldCount()==0);
+	//Insert field at the last position
+	CTextField* field1 = TheFieldSet->NewFieldL(KDummyFieldUid);
+	ret=TheFieldSet->InsertFieldL(5,field1,KDummyFieldUid); // pos=5
+	if(ret != KErrNone && field1 !=NULL)
+		{
+		delete field1;
+		field1 = NULL;
+		}
+		test(ret==KErrNone);
+	ret=UpdateField(5);
+	//Delete last character
+	TheFieldSet->NotifyDeletion(10,1); // pos=10, len=1
+		test(TheFieldSet->CharCount()==13);
+		test(TheFieldSet->FieldCount()==1);
+	//Insert characters at the field position so field moves to 8th pos
+	TheFieldSet->NotifyInsertion(5,3); // pos=5, len=3
+		test(TheFieldSet->CharCount()==16);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,8); // pos=8
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==3);
+		test(info.iFirstFieldPos==8);
+	//Delete last character
+	TheFieldSet->NotifyDeletion(15,1); // pos=15, len=1
+		test(TheFieldSet->CharCount()==15);
+		test(TheFieldSet->FieldCount()==1);
+	//Delete out of range character that doesnt exist..
+	TheFieldSet->NotifyDeletion(15,1); // pos=15, len=1
+		test(TheFieldSet->CharCount()==15);
+		test(TheFieldSet->FieldCount()==1);
+	//Delete all the characters after the field
+	TheFieldSet->NotifyDeletion(11, 4); // pos=11, len=4
+		test(TheFieldSet->CharCount()==11);
+		test(TheFieldSet->FieldCount()==1);
+	//Shorten the field by deleting the last character of the field
+	TheFieldSet->NotifyDeletion(10, 1); // pos=10, len=1
+		test(TheFieldSet->CharCount()==10);
+		test(TheFieldSet->FieldCount()==1);
+	inField=TheFieldSet->FindFields(info,8); // pos=0
+		test(info.iFieldCountInRange==1);
+		test(info.iFirstFieldLen==2);
+		test(info.iFirstFieldPos==8);
+	//length to be removed is one more than the existing data..DEF095911
+	TheFieldSet->NotifyDeletion(0,11); // pos=0, len=11
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	inField=TheFieldSet->FindFields(info,0); // pos=0
+		test(info.iFieldCountInRange==0);
+		test(info.iFirstFieldLen==0);
+		test(info.iFirstFieldPos==0);
+
+	// Finish up
+	TheFieldSet->Reset();
+	}
+
+
+LOCAL_C void test5()
+// Tests inserting, updating and removing a CDateTimeField
+//
+	{
+	test.Next(_L("- Testing CDateTimeField"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// insert a field with default format
+	CTextField* field = TheFieldSet->NewFieldL(KDateTimeFieldUid);
+	TInt ret=TheFieldSet->InsertFieldL(0,field,KDateTimeFieldUid); // pos=0
+		test(ret==KErrNone);
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==1);
+	// get its initial value
+	ret=UpdateField(0);
+		test(ret==KErrNone);
+		test(TheFieldSet->FieldCount()==1);
+	// get its value and display it
+	HBufC* miniBuf = HBufC::NewLC(5); 
+	ret=TheFieldSet->NewFieldValueL(miniBuf,0); // pos=0
+	CleanupStack::Pop();
+	CleanupStack::PushL(miniBuf);
+		test(ret==KErrNone);
+	TPtr buf = miniBuf->Des();
+	test.Printf(_L("  The field value is: "));
+		test.Printf(buf);
+		test.Printf(_L("\n"));
+	// reset the field array
+	TheFieldSet->Reset();
+	CleanupStack::PopAndDestroy(); // miniBuf
+	}
+
+
+LOCAL_C void test6()
+// Tests CDateTimeFields with non-default formatting
+//
+	{
+	test.Next(_L("- Testing CDateTimeField with non-default formatting"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// create a field and set format
+	CTextField* field = TheFieldSet->NewFieldL(KDateTimeFieldUid);
+	((CDateTimeField*)field)->SetFormat(_L("%-A%*I%:1%T%+A")); //
+	// insert field
+	TInt ret=TheFieldSet->InsertFieldL(0,field,KDateTimeFieldUid); // pos=0
+		test(ret==KErrNone);
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==1);
+	// get its initial value
+	ret=UpdateField(0);
+		test(ret==KErrNone);
+//		test(TheFieldSet->CharCount()==5);
+		test(TheFieldSet->FieldCount()==1);
+	// get its value and display it
+	HBufC* miniBuf = HBufC::NewLC(5); 
+	ret=TheFieldSet->NewFieldValueL(miniBuf,0); // pos=0
+	CleanupStack::Pop();
+	CleanupStack::PushL(miniBuf);
+		test(ret==KErrNone);
+	TPtr buf = miniBuf->Des();
+	test.Printf(_L("  The field value is: "));
+		test.Printf(buf);
+		test.Printf(_L("\n"));
+	// reset the field array
+	TheFieldSet->Reset();
+	CleanupStack::PopAndDestroy(); // miniBuf
+	}
+
+
+LOCAL_C void test7()
+// Tests inserting, updating and removing a CPageNumberField
+//
+	{
+	test.Next(_L("- Testing CPageNumberField"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// insert a field with default format
+	CTextField* field = TheFieldSet->NewFieldL(KPageNumberFieldUid);
+	TInt ret=TheFieldSet->InsertFieldL(0,field,KPageNumberFieldUid); // pos=0
+		test(ret==KErrNone);
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==1);
+	// get its initial value
+	ret=UpdateField(0);
+		test(ret==KErrNone);
+		test(TheFieldSet->FieldCount()==1);
+	// get its value and display it
+	HBufC* miniBuf = HBufC::NewLC(5); 
+	ret=TheFieldSet->NewFieldValueL(miniBuf,0); // pos=0
+	CleanupStack::Pop();
+	CleanupStack::PushL(miniBuf);
+		test(ret==KErrNone);
+	TPtr buf = miniBuf->Des();
+	test.Printf(_L("  The field value is: "));
+		test.Printf(buf);
+		test.Printf(_L("\n"));
+	// reset the field array
+	TheFieldSet->Reset();
+	CleanupStack::PopAndDestroy(); // miniBuf
+	}
+
+
+LOCAL_C void test8()
+// Tests inserting, updating and removing a CPageNumberField
+//
+	{
+	test.Next(_L("- Testing CFileNameField"));
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==0);
+	// insert a field with default format
+	CTextField* field = TheFieldSet->NewFieldL(KFileNameFieldUid);
+	TInt ret=TheFieldSet->InsertFieldL(0,field,KFileNameFieldUid); // pos=0
+		test(ret==KErrNone);
+		test(TheFieldSet->CharCount()==0);
+		test(TheFieldSet->FieldCount()==1);
+	// get its initial value
+	ret=UpdateField(0);
+		test(ret==KErrNone);
+		test(TheFieldSet->FieldCount()==1);
+	// get its value and display it
+	HBufC* miniBuf = HBufC::NewLC(5); 
+	ret=TheFieldSet->NewFieldValueL(miniBuf,0); // pos=0
+	CleanupStack::Pop();
+	CleanupStack::PushL(miniBuf);
+		test(ret==KErrNone);
+	TPtr buf = miniBuf->Des();
+	test.Printf(_L("  The field value is: "));
+		test.Printf(buf);
+		test.Printf(_L("\n"));
+	// reset the field array
+	TheFieldSet->Reset();
+	CleanupStack::PopAndDestroy(); // miniBuf
+	}
+
+
+/*
+Added to test the fix to 'EDNHARN-4NVDHC: Text fields are not removed correctly in edwin'. Deletion
+of two fields failed to delete the second one.
+*/
+static void test_multiple_fields()
+	{
+	test.Next(_L(" - testing multiple fields"));
+	test(TheFieldSet->CharCount()==0);
+	test(TheFieldSet->FieldCount()==0);
+
+	/*
+	Insert two dummy fields and some imaginary text. Dummy fields have the value 'XXX'.
+	If the text is represented by 'x's the text will be: "xxXXXxXXXxxxx".
+	*/
+	CTextField* field1 = TheFieldSet->NewFieldL(KDummyFieldUid);
+	TInt ret = TheFieldSet->InsertFieldL(0,field1,KDummyFieldUid);
+	test(ret == KErrNone);
+	test(TheFieldSet->FieldCount() == 1);
+	ret = UpdateField(0);
+	test(ret == KErrNone);
+	CTextField* field2 = TheFieldSet->NewFieldL(KDummyFieldUid);
+	ret = TheFieldSet->InsertFieldL(3,field2,KDummyFieldUid);
+	test(ret == KErrNone);
+	test(TheFieldSet->FieldCount() == 2);
+	ret = UpdateField(3);
+	test(ret == KErrNone);
+	TheFieldSet->NotifyInsertion(0,2);
+	TheFieldSet->NotifyInsertion(5,1);
+	TheFieldSet->NotifyInsertion(9,4);
+	test(TheFieldSet->CharCount() == 13);
+
+	// Delete the two fields and the character between them.
+	TheFieldSet->NotifyDeletion(2,7);
+	test(TheFieldSet->FieldCount() == 0);
+	test(TheFieldSet->CharCount() == 6);
+
+	TheFieldSet->Reset();
+	}
+
+
+LOCAL_C void testFields()
+// Test the fields dll.
+//
+    {
+	test.Start(_L("Testing Fields"));
+	
+	// instantiate the  FieldSet and use the default factory
+	TheFactory = new(ELeave) TTestFieldFactory();
+	TheFieldSet = CTextFieldSet::NewL();
+	TheFieldSet->SetFieldFactory(TheFactory);
+	
+	// the first test just checks that all methods exist (a la Duncan)
+	test1();
+	// Tests inserting, updating and removing a field
+	test2();
+	// Tests FindFields() & InField() in "all" the oddball situations
+	test3();
+	// Tests Insertion and deletion of text around and into fields
+	test4();
+	// Tests the CDateTimeField class
+	test5();
+	// Tests the CDateTimeField class with non-default formatting
+	test6();
+	// Test CPageNumberField
+	test7();
+	// Test CFileNameField
+	test8();
+	// Test multiple field insertion and deletion.
+	test_multiple_fields();
+	
+	// clean up
+	delete TheFieldSet;
+	delete TheFactory;
+	//CleanupStack::PopAndDestroy(); 
+    }
+
+
+LOCAL_C void setupCleanup()
+//
+// Initialise the cleanup stack.
+//
+    {
+
+	TheTrapCleanup=CTrapCleanup::New();
+	TRAPD(r,\
+		{\
+		for (TInt i=KTestCleanupStack;i>0;i--)\
+			CleanupStack::PushL((TAny*)1);\
+		test(r==KErrNone);\
+		CleanupStack::Pop(KTestCleanupStack);\
+		});
+	}
+
+
+GLDEF_C TInt E32Main()
+//
+// Test the streaming framework.
+//
+    {
+
+	test.Title();
+	
+	__UHEAP_MARK;
+	setupCleanup();
+	TRAPD(r,testFields());
+    UNUSED_VAR(r);
+    test(r == KErrNone);
+
+	delete TheTrapCleanup;
+	
+	__UHEAP_MARKEND;
+	test.End();
+	test.Close();
+	return 0;
+    }