Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
380 lines
9.7 KiB
C++
380 lines
9.7 KiB
C++
//===========================================================================//
|
|
// File: RESOURCE_test.CPP //
|
|
// Project: MUNGA Brick: Resource Manager //
|
|
// Contents: Implementation Details of resource managment //
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 01/20/95 GSY Initial coding. //
|
|
// 01/20/95 GAH Added MUNGA style comments and assertions. //
|
|
// 06/14/96 GAH Added preload, referential resource type, the ability to //
|
|
// load resources from separate resource files. //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1995, Virtual World Entertainment, Inc. //
|
|
// All Rights reserved worldwide. //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL. //
|
|
//===========================================================================//
|
|
|
|
#include "AdeptHeaders.hpp"
|
|
|
|
//
|
|
//#############################################################################
|
|
//#############################################################################
|
|
//
|
|
#if 0
|
|
static int
|
|
ResourceManager_RandInt(int x)
|
|
{
|
|
return Random::GetLessThan(x);
|
|
}
|
|
|
|
static MString
|
|
ResourceManager_GenerateName(int count)
|
|
{
|
|
char buffer[256];
|
|
return "resource" + MString(_itoa(count, buffer, 10));
|
|
}
|
|
|
|
static void
|
|
ResourceManager_GenerateStream(DynamicMemoryStream *stream, int count)
|
|
{
|
|
size_t resource_len = (count % (1024*1024/4)) + 1;
|
|
|
|
Check_Object(stream);
|
|
for (int i = 0; i < resource_len; i++)
|
|
{
|
|
stream->WriteBytes(&i, sizeof(i));
|
|
}
|
|
}
|
|
|
|
static void
|
|
ResourceManager_CompareStream(
|
|
DynamicMemoryStream *stream1,
|
|
DynamicMemoryStream *stream2
|
|
)
|
|
{
|
|
Check_Object(stream1);
|
|
Check_Object(stream2);
|
|
|
|
stream1->Rewind();
|
|
stream2->Rewind();
|
|
|
|
Verify(
|
|
stream1->GetStreamLength() ==
|
|
stream2->GetStreamLength()
|
|
);
|
|
|
|
Verify(
|
|
memcmp(
|
|
stream1->GetPointer(),
|
|
stream2->GetPointer(),
|
|
stream1->GetStreamLength()
|
|
) == 0
|
|
);
|
|
}
|
|
#endif
|
|
|
|
//
|
|
//#############################################################################
|
|
//#############################################################################
|
|
//
|
|
void
|
|
ResourceManager::TestClass()
|
|
{
|
|
Check_Object(ResourceManager::Instance);
|
|
STOP(("Not implemented"));
|
|
#if 0
|
|
|
|
//
|
|
// Open a 2 test files
|
|
//
|
|
ResourceManager::Instance->OpenResourceFile(
|
|
"Content\\TestResources1",
|
|
0,
|
|
false,
|
|
true
|
|
);
|
|
|
|
//
|
|
// Generate test resources
|
|
//
|
|
int i, number_of_resources = 1000;
|
|
|
|
for (i = 0; i < number_of_resources; i++)
|
|
{
|
|
DynamicMemoryStream resource_stream;
|
|
ResourceManager_GenerateStream(&resource_stream, i);
|
|
|
|
ResourceDescription *resource_description;
|
|
|
|
resource_description = ResourceManager::Instance->AddResource(
|
|
ResourceManager_GenerateName(i),
|
|
i % 10,
|
|
&resource_stream,
|
|
(i % 5 == 0) ?
|
|
ResourceDescription::Preload :
|
|
ResourceDescription::NoAttributes
|
|
);
|
|
Check_Object(resource_description);
|
|
}
|
|
Verify(ResourceManager::Instance->GetResourceCount() == number_of_resources);
|
|
|
|
//
|
|
// Verify that the resources can be retrieved correctly, and match
|
|
// the ones generated
|
|
//
|
|
for (i = 0; i < number_of_resources; i++)
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
int j = ResourceManager_RandInt(number_of_resources);
|
|
MString resource_name = ResourceManager_GenerateName(j);
|
|
ResourceType type = j % 10;
|
|
|
|
DynamicMemoryStream resource_stream;
|
|
ResourceManager_GenerateStream(&resource_stream, j);
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
Check_Object(resource_description);
|
|
resource_description->Lock();
|
|
Verify(resource_description->recordName == resource_name);
|
|
Verify(resource_description->recordType == type);
|
|
ResourceManager_CompareStream(
|
|
&resource_stream,
|
|
resource_description->recordData
|
|
);
|
|
resource_description->Unlock();
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_description->resourceID
|
|
);
|
|
Check_Object(resource_description);
|
|
resource_description->Lock();
|
|
Verify(resource_description->recordName == resource_name);
|
|
Verify(resource_description->recordType == type);
|
|
ResourceManager_CompareStream(
|
|
&resource_stream,
|
|
resource_description->recordData
|
|
);
|
|
resource_description->Unlock();
|
|
}
|
|
|
|
//
|
|
// Sequence through all records
|
|
//
|
|
ResourceManager::Instance->First();
|
|
for (i = 0; i < number_of_resources; i++)
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
resource_description = ResourceManager::Instance->ReadAndNext();
|
|
Check_Object(resource_description);
|
|
}
|
|
|
|
//
|
|
// Delete a set of records that fit a specific distribution
|
|
//
|
|
for (i = 0; i < number_of_resources; i++)
|
|
{
|
|
if (i % 10 == 0)
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
MString resource_name = ResourceManager_GenerateName(i);
|
|
ResourceType type = i % 10;
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
Check_Object(resource_description);
|
|
ResourceManager::Instance->DeleteResource(resource_description);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Verify that those records do not show up
|
|
//
|
|
for (i = 0; i < number_of_resources; i++)
|
|
{
|
|
if (i % 10 == 0)
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
MString resource_name = ResourceManager_GenerateName(i);
|
|
ResourceType type = i % 10;
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
Verify(resource_description == NULL);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Run stress test
|
|
//
|
|
const int iterations = 1000;
|
|
|
|
for (i = number_of_resources; i < number_of_resources+iterations; i++)
|
|
{
|
|
switch (ResourceManager_RandInt(6))
|
|
{
|
|
case 0:
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
DynamicMemoryStream resource_stream;
|
|
ResourceManager_GenerateStream(&resource_stream, i);
|
|
|
|
resource_description = ResourceManager::Instance->AddResource(
|
|
ResourceManager_GenerateName(i),
|
|
i % 10,
|
|
&resource_stream,
|
|
(i % 5 == 0) ?
|
|
ResourceDescription::Preload :
|
|
ResourceDescription::NoAttributes
|
|
);
|
|
Check_Object(resource_description);
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
{
|
|
ResourceDescription *resource_description, *resource_description2;
|
|
|
|
int j = ResourceManager_RandInt(ResourceManager::Instance->GetResourceCount());
|
|
MString resource_name = ResourceManager_GenerateName(j);
|
|
ResourceType type = j % 10;
|
|
|
|
DynamicMemoryStream resource_stream;
|
|
ResourceManager_GenerateStream(&resource_stream, j);
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
if (resource_description != NULL)
|
|
{
|
|
Check_Object(resource_description);
|
|
|
|
resource_description->Lock();
|
|
Verify(resource_description->recordName == resource_name);
|
|
Verify(resource_description->recordType == type);
|
|
ResourceManager_CompareStream(
|
|
&resource_stream,
|
|
resource_description->recordData
|
|
);
|
|
// resource_description->Unlock();
|
|
|
|
resource_description2 = ResourceManager::Instance->GetResource(
|
|
resource_description->resourceID
|
|
);
|
|
Verify(resource_description2 == resource_description);
|
|
Verify(resource_description->IsLocked());
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
int j = ResourceManager_RandInt(i);
|
|
MString resource_name = ResourceManager_GenerateName(j);
|
|
ResourceType type = j % 10;
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
if (
|
|
resource_description != NULL &&
|
|
resource_description->IsLocked()
|
|
)
|
|
{
|
|
Check_Object(resource_description);
|
|
resource_description->Unlock();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
int j = ResourceManager_RandInt(i);
|
|
MString resource_name = ResourceManager_GenerateName(j);
|
|
ResourceType type = j % 10;
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
if (resource_description != NULL)
|
|
{
|
|
PlugLocker locker(resource_description);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
int j = ResourceManager_RandInt(i);
|
|
MString resource_name = ResourceManager_GenerateName(j);
|
|
ResourceType type = j % 10;
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
if (resource_description != NULL)
|
|
{
|
|
resource_description->Save();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 5:
|
|
{
|
|
ResourceDescription *resource_description;
|
|
|
|
int j = ResourceManager_RandInt(i);
|
|
MString resource_name = ResourceManager_GenerateName(j);
|
|
ResourceType type = j % 10;
|
|
|
|
resource_description = ResourceManager::Instance->GetResource(
|
|
resource_name,
|
|
type
|
|
);
|
|
if (
|
|
resource_description != NULL &&
|
|
!resource_description->IsLocked()
|
|
)
|
|
{
|
|
resource_description->Delete();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Exercise preload routines
|
|
//
|
|
ResourceManager::Instance->BuildPreloadList();
|
|
ResourceManager::Instance->Preload();
|
|
|
|
//
|
|
// Close
|
|
//
|
|
ResourceManager::Instance->Close(true, true);
|
|
#endif
|
|
}
|