imgtools/romtools/rombuild/r_t_areaset.cpp
changeset 590 360bd6b35136
parent 0 044383f39525
--- a/imgtools/romtools/rombuild/r_t_areaset.cpp	Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/romtools/rombuild/r_t_areaset.cpp	Wed Jun 23 16:56:47 2010 +0800
@@ -1,428 +1,423 @@
-/*
-* Copyright (c) 2001-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: 
-* AreaSet Unit Tests
-*
-*/
-
-
-#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
-#include <iostream>
-#else //!__MSVCDOTNET__
-#include <iostream.h>
-#endif //__MSVCDOTNET__
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "r_areaset.h"
-#include "r_rom.h"
-
-////////////////////////////////////////////////////////////////////////
-
-LOCAL_C void Test(TBool aExpr, const char* aMsg)
-	{
-	if (! aExpr)
-		{
-		cerr << "Test Failed: " << aMsg << '\n';
-		exit(1);
-		}
-	}
-
-
-LOCAL_C void CheckAreas(const AreaSet* aPAreaSet, ...)
-	{
-	va_list l;
-	va_start(l, aPAreaSet);
-
-	TInt areaCount;
-	for (areaCount = 0;; ++areaCount)
-		{
-		const char* name = va_arg(l, const char*);
-		if (name == 0)
-			break;
-
-		TLinAddr startAddr = va_arg(l, TLinAddr);
-		TUint size = va_arg(l, TUint);
-
-		const Area* pArea = aPAreaSet->FindByName(name);
-		Test(pArea != 0, "unknown name");
-		Test(pArea->DestBaseAddr() == startAddr, "incorrect area start address");
-		Test(pArea->MaxSize() == size, "incorrect area size");
-		}
-
-	Test(areaCount == aPAreaSet->Count(), "incorrect number of areas");
-
-	va_end(l);
-	}
-
-////////////////////////////////////////////////////////////////////////
-
-LOCAL_C void TestAddAreaSuccess()
-	{
-	cout << "TestAddAreaSuccess...\n";
-
-	AreaSet areaSet;
-
-	const char KName1[] = "toto";
-	const TLinAddr KStart1 = 0x666;
-	const TUint KSize1 = 0x42;
-
-	const char* overlappingArea;
-	AreaSet::TAddResult r = areaSet.AddArea(KName1, KStart1, KSize1, overlappingArea);
-	Test(r == AreaSet::EAdded, "adding area 1");
-	Test(overlappingArea == 0, "incorrect overlapping area 1");
-	CheckAreas(&areaSet, KName1, KStart1, KSize1, 0);
-
-	const char KName2[] = "foobar";
-	const TLinAddr KStart2 = 0x100000;
-	const TUint KSize2 = 0x100;
-
-	r = areaSet.AddArea(KName2, KStart2, KSize2, overlappingArea);
-	Test(r == AreaSet::EAdded, "adding area 2");
-	Test(overlappingArea == 0, "incorrect overlapping area 2");
-	CheckAreas(&areaSet, KName1, KStart1, KSize1, KName2, KStart2, KSize2, 0);
-	}
-
-
-LOCAL_C void TestAddingTwoAreas(const char* aName1, TLinAddr aDestBaseAddr1, TUint aSize1,
-								const char* aName2, TLinAddr aDestBaseAddr2, TUint aSize2,
-								AreaSet::TAddResult aExpectedResult)
-	{
-	cout << "Testing overlap between " << aName1 << " and " << aName2 << "\n";
-
-	AreaSet areaSet;
-
-	const char* overlappingArea;
-	AreaSet::TAddResult r = areaSet.AddArea(aName1, aDestBaseAddr1, aSize1, overlappingArea);
-	Test(r == AreaSet::EAdded, "adding area 1");
-	Test(overlappingArea == 0, "incorrect overlapping area 1");
-
-	r = areaSet.AddArea(aName2, aDestBaseAddr2, aSize2, overlappingArea);
-	Test(r == aExpectedResult, "adding area 2");
-
-	Test(areaSet.Count() == ((aExpectedResult == AreaSet::EAdded) ? 2 : 1),
-		 "incorrect area count");
-	if (aExpectedResult == AreaSet::EAdded)
-		{
-		Test(areaSet.Count() == 2, "incorrect area count (should be 2)");
-		Test(overlappingArea == 0, "incorrect overlapping area 2 (should be 0)");
-		}
-	else
-		{
-		Test(areaSet.Count() == 1, "incorrect area count (should be 1)");
-		if (aExpectedResult == AreaSet::EOverlap)
-			Test(strcmp(overlappingArea, aName1) == 0, "incorrect overlapping area 2 (bad name)");
-		else
-			Test(overlappingArea == 0, "incorrect overlapping area 2 (should be 0)");
-		}
-	}
-
-
-LOCAL_C void TestAddAreaOverlap()
-	{
-	cout << "TestAddAreaOverlap...\n";
-
-	const char KNameInitial[] = "initial";
-	const TLinAddr KStartInitial = 0x1000;
-	const TUint KSizeInitial = 0x101;
-
-	// new area overlapping first byte of initial one
-	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
-					   "overlap 1", 0x0F00, 0x101, AreaSet::EOverlap);
-
-	// new area overlapping last byte of initial one
-	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
-					   "overlap 2", 0x01100, 0x101, AreaSet::EOverlap);
-
-	// new area embedded in the initial one
-	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
-					   "overlap 3", 0x01010, 0x10, AreaSet::EOverlap);
-
-	// existing area overlapping first byte of new one
-	TestAddingTwoAreas(KNameInitial, 0x0F00, 0x101, "overlap 10",
-					   KStartInitial, KSizeInitial, AreaSet::EOverlap);
-
-	// existing area overlapping last byte of new one
-	TestAddingTwoAreas(KNameInitial, 0x01100, 0x101, "overlap 11",
-					   KStartInitial, KSizeInitial, AreaSet::EOverlap);
-
-	// existing area embedded in the new one
-	TestAddingTwoAreas(KNameInitial, 0x01010, 0x10, "overlap 12",
-					   KStartInitial, KSizeInitial, AreaSet::EOverlap);
-
-	// new area just before the initial one
-	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
-					   "overlap 4", 0x0F00, 0x100, AreaSet::EAdded);
-	
-	// new area just after the initial one
-	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
-					   "overlap 5", 0x01101, 0x100, AreaSet::EAdded);
-	}
-
-
-LOCAL_C void TestAddAreaDuplicateName()
-	{
-	cout << "TestAddAreaDuplicateName...\n";
-	
-	TestAddingTwoAreas("foobar", 0x10, 0x10,
-					   "foobar", 0x100, 0x10,
-					   AreaSet::EDuplicateName);
-	}
-
-
-LOCAL_C void TestAddAreaOverflow()
-	{
-	cout << "TestAddAreaOverflow...\n";
-	
-	AreaSet areaSet;
-
-	const char KName1[] = "foobar";
-	const char* overlappingArea;
-	AreaSet::TAddResult r = areaSet.AddArea(KName1, 0xFFFFFFFF, 0x02, overlappingArea);
-	Test(r == AreaSet::EOverflow, "adding area 1");
-	Test(areaSet.Count() == 0, "incorrect count after trying to add area 1");
-	Test(areaSet.FindByName(KName1) == 0, "Unexpected name found after trying to add area 1");
-	Test(overlappingArea == 0, "incorrect overlapping area 1");
-
-	const char KName2[] = "barfoo";
-	r = areaSet.AddArea(KName2, 0xFFFFFFFF, 0xFFFFFFFF, overlappingArea);
-	Test(r == AreaSet::EOverflow, "adding area 2");
-	Test(areaSet.Count() == 0, "incorrect count after trying to add area 2");
-	Test(areaSet.FindByName(KName2) == 0, "Unexpected name found after trying to add area 2");
-	Test(overlappingArea == 0, "incorrect overlapping area 2");
-	}
-
-
-
-LOCAL_C void TestAddArea()
-	{
-	TestAddAreaSuccess();
-	TestAddAreaOverlap();
-	TestAddAreaDuplicateName();
-	TestAddAreaOverflow();
-	}
-
-LOCAL_C void TestSrcAddrManipulations()
-	{
-	cout << "TestSrcAddrManipulations...\n";
-
-	//
-	// Creating an AreaSet instance containing one area
-	//
-
-	AreaSet areaSet;
-	const char* overlappingArea;
-	const char KAreaName[] = "foobar";
-	const TUint KMaxSize = 10;
-	AreaSet::TAddResult r = areaSet.AddArea(KAreaName, 0x100, KMaxSize, overlappingArea);
-	Test(r == AreaSet::EAdded, "Failed to add area");
-
-	Area* area = areaSet.FindByName(KAreaName);
-	Test(area != 0, "Failed to find area");
-
-	Test(area->UsedSize() == 0, "used size before allocation");
-
-	const TUint KSrcBaseAddr = 0x100;
-	area->SetSrcBaseAddr(KSrcBaseAddr);
-
-	Test(area->SrcBaseAddr() == KSrcBaseAddr, "destination base address before allocation");
-	Test(area->SrcBaseAddr() == area->SrcLimitAddr(), "destination limit address before allocation");
-
-	//
-	// Allocating some space in the area
-	//
-
-	const TUint KAlloc1 = KMaxSize-1;
-	TUint overflow;
-	TBool allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1, overflow);
-	Test(allocated, "allocation 1 failed");
-	Test(area->UsedSize() == KAlloc1, "used size after allocation 1");
-	Test(area->SrcBaseAddr()+KAlloc1 == area->SrcLimitAddr(), "destination limit address after allocation 1");
-
-	//
-	// Allocating more than available
-	//
-
-	const TUint KAlloc2 = KMaxSize*2;
-	allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1+KAlloc2, overflow);
-	Test(! allocated, "allocation 2 should have failed");
-	Test(overflow == KAlloc2+KAlloc1 - KMaxSize, "overflow after allocation 2");
-	Test(area->UsedSize() == KAlloc1, "used size after allocation 2");
-	Test(area->SrcBaseAddr()+KAlloc1 == area->SrcLimitAddr(), "destination limit address after allocation 2");
-
-	//
-	// Allocating just enough to fill the area completely  
-	//
-
-	const TUint KAlloc3 = KMaxSize-KAlloc1;
-	allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1+KAlloc3, overflow);
-	Test(allocated, "allocation 3 failed");
-	Test(area->UsedSize() == KAlloc1+KAlloc3, "used size after allocation 3");
-	Test(area->UsedSize() == area->MaxSize(), "used size and max size should be equal");
-	Test(area->SrcBaseAddr()+KAlloc1+KAlloc3 == area->SrcLimitAddr(), "destination limit address after allocation 3");
-
-	//
-	// Overflowing the area by one byte
-	//
-
-	const TUint KAlloc4 = 1;
-	allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1+KAlloc3+KAlloc4, overflow);
-	Test(! allocated, "allocation 4 should have failed");
-	Test(overflow == 1, "overflow after allocation 4");
-	Test(area->UsedSize() == KAlloc1+KAlloc3, "used size after allocation 4");
-	Test(area->SrcBaseAddr()+KAlloc1+KAlloc3 == area->SrcLimitAddr(), "destination limit address after allocation 4");
-	}
-
-
-LOCAL_C void TestFileIterator()
-	{
-	cout << "TestFileIterator...\n";
-
-	//
-	// Creating an area set containing one area
-	//
-
-	AreaSet areaSet;
-	const char* overlappingArea;
-	const char KAreaName[] = "foobar";
-	const TUint KMaxSize = 10;
-	AreaSet::TAddResult r = areaSet.AddArea(KAreaName, 0x100, KMaxSize, overlappingArea);
-	Test(r == AreaSet::EAdded, "Failed to add area");
-
-	Area* area = areaSet.FindByName(KAreaName);
-	Test(area != 0, "Failed to find area");
-
-	FilesInAreaIterator it1(*area);
-	Test(it1.IsDone(), "it1.IsDone()");
-
-	//
-	// Adding one file to that area
-	//
-	
-	TRomBuilderEntry* pfile1 = new TRomBuilderEntry("file1", (TText*) "file1");
-	area->AddFile(pfile1);
-
-	FilesInAreaIterator it2(*area);
-	Test(! it2.IsDone(), "! it2.IsDone() 1");
-	Test(it2.Current() == pfile1, "it2.Current() == pfile1");
-
-	it2.GoToNext();
-	Test(it2.IsDone(), "it2.IsDone()");
-
-	//
-	// Adding a second file to that area
-	//
-
-	TRomBuilderEntry* pFile2 = new TRomBuilderEntry("file2", (TText*) "file2");
-	area->AddFile(pFile2);
-
-	FilesInAreaIterator it3(*area);
-	Test(! it3.IsDone(), "! it3.IsDone() 1");
-	Test(it3.Current() == pfile1, "it3.Current() == pfile1");
-
-	it3.GoToNext();
-	Test(! it3.IsDone(), "it3.IsDone() 2");
-	Test(it3.Current() == pFile2, "it3.Current() == pFile2");
-
-	it3.GoToNext();
-	Test(it3.IsDone(), "it3.IsDone()");
-	}
-
-
-LOCAL_C void TestNonDefaultAreaIterator() 
-	{
-	cout << "TestNonDefaultAreaIterator...\n";
-
-	//
-	// Creating an area set
-	//
-
-	AreaSet areaSet;
-
-	NonDefaultAreasIterator it1(areaSet);
-	Test(it1.IsDone(), "it1.IsDone()");
-	
-	//
-	// Adding a first non default area
-	//
-
-	const char* overlappingArea;
-	const char KAreaName1[] = "area 1";
-	AreaSet::TAddResult r = areaSet.AddArea(KAreaName1, 0x100, 0x10, overlappingArea);
-	Test(r == AreaSet::EAdded, "Failed to add area 1");
-
-	Area* pArea1 = areaSet.FindByName(KAreaName1);
-	Test(pArea1 != 0, "Failed to find area 1");
-
-	NonDefaultAreasIterator it2(areaSet);
-	Test(! it2.IsDone(), "! it2.IsDone()");
-
-	Test(&it2.Current() == pArea1, "&it2.Current() == pArea1");
-
-	it2.GoToNext();
-	Test(it2.IsDone(), "it2.IsDone()");
-
-	//
-	// Adding a default area
-	//
-
-	r = areaSet.AddArea(AreaSet::KDefaultAreaName, 0x50000000, 0x00200000, overlappingArea);
-	Test(r == AreaSet::EAdded, "failed to add default area");
-
-	NonDefaultAreasIterator it3(areaSet);
-	Test(! it3.IsDone(), "! it3.IsDone()");
-
-	Test(&it3.Current() == pArea1, "&it3.Current() == pArea1");
-
-	it3.GoToNext();
-	Test(it3.IsDone(), "it3.IsDone()");
-
-	//
-	// Adding a second non default area
-	//
-
-	const char KAreaName2[] = "area 2";
-	r = areaSet.AddArea(KAreaName2, 0x1000, 0x10, overlappingArea);
-	Test(r == AreaSet::EAdded, "Failed to add area 2");
-
-	Area* pArea2 = areaSet.FindByName(KAreaName2);
-	Test(pArea2 != 0, "Failed to find area 2");
-
-	NonDefaultAreasIterator it4(areaSet);
-	Test(! it4.IsDone(), "! it4.IsDone()");
-
-	Test(&it4.Current() == pArea2, "&it4.Current() == pArea2");
-
-	it4.GoToNext();
-	Test(! it4.IsDone(), "it4.IsDone()");
-	Test(&it4.Current() == pArea1, "&it4.Current() == pArea1");
-
-	it4.GoToNext();
-	Test(it4.IsDone(), "it4.IsDone()");
-	}
-
-////////////////////////////////////////////////////////////////////////
-
-GLDEF_C int main() 
-	{
-	TestAddArea();
-	TestSrcAddrManipulations();
-	TestFileIterator();
-	TestNonDefaultAreaIterator();
-
-	cout << "\nTests OK\n";
-	return 0;
-	}
+/*
+* Copyright (c) 2001-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: 
+* AreaSet Unit Tests
+*
+*/
+
+ 
+#include <iostream> 
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "r_areaset.h"
+#include "r_rom.h"
+
+////////////////////////////////////////////////////////////////////////
+
+LOCAL_C void Test(TBool aExpr, const char* aMsg)
+	{
+	if (! aExpr)
+		{
+		cerr << "Test Failed: " << aMsg << '\n';
+		exit(1);
+		}
+	}
+
+
+LOCAL_C void CheckAreas(const AreaSet* aPAreaSet, ...)
+	{
+	va_list l;
+	va_start(l, aPAreaSet);
+
+	TInt areaCount;
+	for (areaCount = 0;; ++areaCount)
+		{
+		const char* name = va_arg(l, const char*);
+		if (name == 0)
+			break;
+
+		TLinAddr startAddr = va_arg(l, TLinAddr);
+		TUint size = va_arg(l, TUint);
+
+		const Area* pArea = aPAreaSet->FindByName(name);
+		Test(pArea != 0, "unknown name");
+		Test(pArea->DestBaseAddr() == startAddr, "incorrect area start address");
+		Test(pArea->MaxSize() == size, "incorrect area size");
+		}
+
+	Test(areaCount == aPAreaSet->Count(), "incorrect number of areas");
+
+	va_end(l);
+	}
+
+////////////////////////////////////////////////////////////////////////
+
+LOCAL_C void TestAddAreaSuccess()
+	{
+	cout << "TestAddAreaSuccess...\n";
+
+	AreaSet areaSet;
+
+	const char KName1[] = "toto";
+	const TLinAddr KStart1 = 0x666;
+	const TUint KSize1 = 0x42;
+
+	const char* overlappingArea;
+	AreaSet::TAddResult r = areaSet.AddArea(KName1, KStart1, KSize1, overlappingArea);
+	Test(r == AreaSet::EAdded, "adding area 1");
+	Test(overlappingArea == 0, "incorrect overlapping area 1");
+	CheckAreas(&areaSet, KName1, KStart1, KSize1, 0);
+
+	const char KName2[] = "foobar";
+	const TLinAddr KStart2 = 0x100000;
+	const TUint KSize2 = 0x100;
+
+	r = areaSet.AddArea(KName2, KStart2, KSize2, overlappingArea);
+	Test(r == AreaSet::EAdded, "adding area 2");
+	Test(overlappingArea == 0, "incorrect overlapping area 2");
+	CheckAreas(&areaSet, KName1, KStart1, KSize1, KName2, KStart2, KSize2, 0);
+	}
+
+
+LOCAL_C void TestAddingTwoAreas(const char* aName1, TLinAddr aDestBaseAddr1, TUint aSize1,
+								const char* aName2, TLinAddr aDestBaseAddr2, TUint aSize2,
+								AreaSet::TAddResult aExpectedResult)
+	{
+	cout << "Testing overlap between " << aName1 << " and " << aName2 << "\n";
+
+	AreaSet areaSet;
+
+	const char* overlappingArea;
+	AreaSet::TAddResult r = areaSet.AddArea(aName1, aDestBaseAddr1, aSize1, overlappingArea);
+	Test(r == AreaSet::EAdded, "adding area 1");
+	Test(overlappingArea == 0, "incorrect overlapping area 1");
+
+	r = areaSet.AddArea(aName2, aDestBaseAddr2, aSize2, overlappingArea);
+	Test(r == aExpectedResult, "adding area 2");
+
+	Test(areaSet.Count() == ((aExpectedResult == AreaSet::EAdded) ? 2 : 1),
+		 "incorrect area count");
+	if (aExpectedResult == AreaSet::EAdded)
+		{
+		Test(areaSet.Count() == 2, "incorrect area count (should be 2)");
+		Test(overlappingArea == 0, "incorrect overlapping area 2 (should be 0)");
+		}
+	else
+		{
+		Test(areaSet.Count() == 1, "incorrect area count (should be 1)");
+		if (aExpectedResult == AreaSet::EOverlap)
+			Test(strcmp(overlappingArea, aName1) == 0, "incorrect overlapping area 2 (bad name)");
+		else
+			Test(overlappingArea == 0, "incorrect overlapping area 2 (should be 0)");
+		}
+	}
+
+
+LOCAL_C void TestAddAreaOverlap()
+	{
+	cout << "TestAddAreaOverlap...\n";
+
+	const char KNameInitial[] = "initial";
+	const TLinAddr KStartInitial = 0x1000;
+	const TUint KSizeInitial = 0x101;
+
+	// new area overlapping first byte of initial one
+	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
+					   "overlap 1", 0x0F00, 0x101, AreaSet::EOverlap);
+
+	// new area overlapping last byte of initial one
+	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
+					   "overlap 2", 0x01100, 0x101, AreaSet::EOverlap);
+
+	// new area embedded in the initial one
+	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
+					   "overlap 3", 0x01010, 0x10, AreaSet::EOverlap);
+
+	// existing area overlapping first byte of new one
+	TestAddingTwoAreas(KNameInitial, 0x0F00, 0x101, "overlap 10",
+					   KStartInitial, KSizeInitial, AreaSet::EOverlap);
+
+	// existing area overlapping last byte of new one
+	TestAddingTwoAreas(KNameInitial, 0x01100, 0x101, "overlap 11",
+					   KStartInitial, KSizeInitial, AreaSet::EOverlap);
+
+	// existing area embedded in the new one
+	TestAddingTwoAreas(KNameInitial, 0x01010, 0x10, "overlap 12",
+					   KStartInitial, KSizeInitial, AreaSet::EOverlap);
+
+	// new area just before the initial one
+	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
+					   "overlap 4", 0x0F00, 0x100, AreaSet::EAdded);
+	
+	// new area just after the initial one
+	TestAddingTwoAreas(KNameInitial, KStartInitial, KSizeInitial,
+					   "overlap 5", 0x01101, 0x100, AreaSet::EAdded);
+	}
+
+
+LOCAL_C void TestAddAreaDuplicateName()
+	{
+	cout << "TestAddAreaDuplicateName...\n";
+	
+	TestAddingTwoAreas("foobar", 0x10, 0x10,
+					   "foobar", 0x100, 0x10,
+					   AreaSet::EDuplicateName);
+	}
+
+
+LOCAL_C void TestAddAreaOverflow()
+	{
+	cout << "TestAddAreaOverflow...\n";
+	
+	AreaSet areaSet;
+
+	const char KName1[] = "foobar";
+	const char* overlappingArea;
+	AreaSet::TAddResult r = areaSet.AddArea(KName1, 0xFFFFFFFF, 0x02, overlappingArea);
+	Test(r == AreaSet::EOverflow, "adding area 1");
+	Test(areaSet.Count() == 0, "incorrect count after trying to add area 1");
+	Test(areaSet.FindByName(KName1) == 0, "Unexpected name found after trying to add area 1");
+	Test(overlappingArea == 0, "incorrect overlapping area 1");
+
+	const char KName2[] = "barfoo";
+	r = areaSet.AddArea(KName2, 0xFFFFFFFF, 0xFFFFFFFF, overlappingArea);
+	Test(r == AreaSet::EOverflow, "adding area 2");
+	Test(areaSet.Count() == 0, "incorrect count after trying to add area 2");
+	Test(areaSet.FindByName(KName2) == 0, "Unexpected name found after trying to add area 2");
+	Test(overlappingArea == 0, "incorrect overlapping area 2");
+	}
+
+
+
+LOCAL_C void TestAddArea()
+	{
+	TestAddAreaSuccess();
+	TestAddAreaOverlap();
+	TestAddAreaDuplicateName();
+	TestAddAreaOverflow();
+	}
+
+LOCAL_C void TestSrcAddrManipulations()
+	{
+	cout << "TestSrcAddrManipulations...\n";
+
+	//
+	// Creating an AreaSet instance containing one area
+	//
+
+	AreaSet areaSet;
+	const char* overlappingArea;
+	const char KAreaName[] = "foobar";
+	const TUint KMaxSize = 10;
+	AreaSet::TAddResult r = areaSet.AddArea(KAreaName, 0x100, KMaxSize, overlappingArea);
+	Test(r == AreaSet::EAdded, "Failed to add area");
+
+	Area* area = areaSet.FindByName(KAreaName);
+	Test(area != 0, "Failed to find area");
+
+	Test(area->UsedSize() == 0, "used size before allocation");
+
+	const TUint KSrcBaseAddr = 0x100;
+	area->SetSrcBaseAddr(KSrcBaseAddr);
+
+	Test(area->SrcBaseAddr() == KSrcBaseAddr, "destination base address before allocation");
+	Test(area->SrcBaseAddr() == area->SrcLimitAddr(), "destination limit address before allocation");
+
+	//
+	// Allocating some space in the area
+	//
+
+	const TUint KAlloc1 = KMaxSize-1;
+	TUint overflow;
+	TBool allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1, overflow);
+	Test(allocated, "allocation 1 failed");
+	Test(area->UsedSize() == KAlloc1, "used size after allocation 1");
+	Test(area->SrcBaseAddr()+KAlloc1 == area->SrcLimitAddr(), "destination limit address after allocation 1");
+
+	//
+	// Allocating more than available
+	//
+
+	const TUint KAlloc2 = KMaxSize*2;
+	allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1+KAlloc2, overflow);
+	Test(! allocated, "allocation 2 should have failed");
+	Test(overflow == KAlloc2+KAlloc1 - KMaxSize, "overflow after allocation 2");
+	Test(area->UsedSize() == KAlloc1, "used size after allocation 2");
+	Test(area->SrcBaseAddr()+KAlloc1 == area->SrcLimitAddr(), "destination limit address after allocation 2");
+
+	//
+	// Allocating just enough to fill the area completely  
+	//
+
+	const TUint KAlloc3 = KMaxSize-KAlloc1;
+	allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1+KAlloc3, overflow);
+	Test(allocated, "allocation 3 failed");
+	Test(area->UsedSize() == KAlloc1+KAlloc3, "used size after allocation 3");
+	Test(area->UsedSize() == area->MaxSize(), "used size and max size should be equal");
+	Test(area->SrcBaseAddr()+KAlloc1+KAlloc3 == area->SrcLimitAddr(), "destination limit address after allocation 3");
+
+	//
+	// Overflowing the area by one byte
+	//
+
+	const TUint KAlloc4 = 1;
+	allocated = area->ExtendSrcLimitAddr(KSrcBaseAddr+KAlloc1+KAlloc3+KAlloc4, overflow);
+	Test(! allocated, "allocation 4 should have failed");
+	Test(overflow == 1, "overflow after allocation 4");
+	Test(area->UsedSize() == KAlloc1+KAlloc3, "used size after allocation 4");
+	Test(area->SrcBaseAddr()+KAlloc1+KAlloc3 == area->SrcLimitAddr(), "destination limit address after allocation 4");
+	}
+
+
+LOCAL_C void TestFileIterator()
+	{
+	cout << "TestFileIterator...\n";
+
+	//
+	// Creating an area set containing one area
+	//
+
+	AreaSet areaSet;
+	const char* overlappingArea;
+	const char KAreaName[] = "foobar";
+	const TUint KMaxSize = 10;
+	AreaSet::TAddResult r = areaSet.AddArea(KAreaName, 0x100, KMaxSize, overlappingArea);
+	Test(r == AreaSet::EAdded, "Failed to add area");
+
+	Area* area = areaSet.FindByName(KAreaName);
+	Test(area != 0, "Failed to find area");
+
+	FilesInAreaIterator it1(*area);
+	Test(it1.IsDone(), "it1.IsDone()");
+
+	//
+	// Adding one file to that area
+	//
+	
+	TRomBuilderEntry* pfile1 = new TRomBuilderEntry("file1", "file1");
+	area->AddFile(pfile1);
+
+	FilesInAreaIterator it2(*area);
+	Test(! it2.IsDone(), "! it2.IsDone() 1");
+	Test(it2.Current() == pfile1, "it2.Current() == pfile1");
+
+	it2.GoToNext();
+	Test(it2.IsDone(), "it2.IsDone()");
+
+	//
+	// Adding a second file to that area
+	//
+
+	TRomBuilderEntry* pFile2 = new TRomBuilderEntry("file2", "file2");
+	area->AddFile(pFile2);
+
+	FilesInAreaIterator it3(*area);
+	Test(! it3.IsDone(), "! it3.IsDone() 1");
+	Test(it3.Current() == pfile1, "it3.Current() == pfile1");
+
+	it3.GoToNext();
+	Test(! it3.IsDone(), "it3.IsDone() 2");
+	Test(it3.Current() == pFile2, "it3.Current() == pFile2");
+
+	it3.GoToNext();
+	Test(it3.IsDone(), "it3.IsDone()");
+	}
+
+
+LOCAL_C void TestNonDefaultAreaIterator() 
+	{
+	cout << "TestNonDefaultAreaIterator...\n";
+
+	//
+	// Creating an area set
+	//
+
+	AreaSet areaSet;
+
+	NonDefaultAreasIterator it1(areaSet);
+	Test(it1.IsDone(), "it1.IsDone()");
+	
+	//
+	// Adding a first non default area
+	//
+
+	const char* overlappingArea;
+	const char KAreaName1[] = "area 1";
+	AreaSet::TAddResult r = areaSet.AddArea(KAreaName1, 0x100, 0x10, overlappingArea);
+	Test(r == AreaSet::EAdded, "Failed to add area 1");
+
+	Area* pArea1 = areaSet.FindByName(KAreaName1);
+	Test(pArea1 != 0, "Failed to find area 1");
+
+	NonDefaultAreasIterator it2(areaSet);
+	Test(! it2.IsDone(), "! it2.IsDone()");
+
+	Test(&it2.Current() == pArea1, "&it2.Current() == pArea1");
+
+	it2.GoToNext();
+	Test(it2.IsDone(), "it2.IsDone()");
+
+	//
+	// Adding a default area
+	//
+
+	r = areaSet.AddArea(AreaSet::KDefaultAreaName, 0x50000000, 0x00200000, overlappingArea);
+	Test(r == AreaSet::EAdded, "failed to add default area");
+
+	NonDefaultAreasIterator it3(areaSet);
+	Test(! it3.IsDone(), "! it3.IsDone()");
+
+	Test(&it3.Current() == pArea1, "&it3.Current() == pArea1");
+
+	it3.GoToNext();
+	Test(it3.IsDone(), "it3.IsDone()");
+
+	//
+	// Adding a second non default area
+	//
+
+	const char KAreaName2[] = "area 2";
+	r = areaSet.AddArea(KAreaName2, 0x1000, 0x10, overlappingArea);
+	Test(r == AreaSet::EAdded, "Failed to add area 2");
+
+	Area* pArea2 = areaSet.FindByName(KAreaName2);
+	Test(pArea2 != 0, "Failed to find area 2");
+
+	NonDefaultAreasIterator it4(areaSet);
+	Test(! it4.IsDone(), "! it4.IsDone()");
+
+	Test(&it4.Current() == pArea2, "&it4.Current() == pArea2");
+
+	it4.GoToNext();
+	Test(! it4.IsDone(), "it4.IsDone()");
+	Test(&it4.Current() == pArea1, "&it4.Current() == pArea1");
+
+	it4.GoToNext();
+	Test(it4.IsDone(), "it4.IsDone()");
+	}
+
+////////////////////////////////////////////////////////////////////////
+
+GLDEF_C int main() 
+	{
+	TestAddArea();
+	TestSrcAddrManipulations();
+	TestFileIterator();
+	TestNonDefaultAreaIterator();
+
+	cout << "\nTests OK\n";
+	return 0;
+	}