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.
538 lines
12 KiB
C++
538 lines
12 KiB
C++
//===========================================================================//
|
|
// File: chain.tst //
|
|
// Project: MUNGA Brick: Connection Library //
|
|
// Contents: Verify function for chain class //
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 09/29/94 ECH Initial coding. //
|
|
// 10/28/94 JMA Made compatible with SGI CC //
|
|
// 11/03/94 ECH Made compatible with BC4.0 //
|
|
// 11/04/94 JMA Made compatible with GNU C++ //
|
|
// 11/04/94 ECH Merged changes
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1994, Virtual World Entertainment, Inc. All Rights reserved //
|
|
// PROPRIETARY AND CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "StuffHeaders.hpp"
|
|
#include <GameOS\ToolOS.hpp>
|
|
|
|
#define TEST_COUNT 50
|
|
|
|
class ChainTestPlug:
|
|
public Plug
|
|
{
|
|
public:
|
|
long value;
|
|
|
|
ChainTestPlug(long value);
|
|
~ChainTestPlug();
|
|
};
|
|
|
|
class ChainTestNode:
|
|
public Plug
|
|
{
|
|
public:
|
|
int receivedCommand;
|
|
|
|
ChainOf<ChainTestPlug*> chain1;
|
|
ChainOf<ChainTestPlug*> chain2;
|
|
|
|
ChainTestNode();
|
|
~ChainTestNode();
|
|
|
|
bool RunProfile();
|
|
bool RunTest();
|
|
};
|
|
|
|
ChainTestPlug::ChainTestPlug(long value):
|
|
Plug(DefaultData)
|
|
{
|
|
this->value = value;
|
|
}
|
|
|
|
ChainTestPlug::~ChainTestPlug()
|
|
{
|
|
}
|
|
|
|
ChainTestNode::ChainTestNode():
|
|
Plug(DefaultData),
|
|
chain1(NULL),
|
|
chain2(NULL)
|
|
{
|
|
receivedCommand = 0;
|
|
}
|
|
|
|
ChainTestNode::~ChainTestNode()
|
|
{
|
|
}
|
|
|
|
//
|
|
//###########################################################################
|
|
// ProfileClass
|
|
//###########################################################################
|
|
//
|
|
bool
|
|
Chain::ProfileClass()
|
|
{
|
|
ChainTestNode testNode;
|
|
#if defined(_ARMOR)
|
|
Time startTicks = gos_GetHiResTime();
|
|
#endif
|
|
|
|
Test_Message("Chain::ProfileClass\n");
|
|
|
|
testNode.RunProfile();
|
|
|
|
SPEW((
|
|
GROUP_STUFF_TEST,
|
|
"Chain::ProfileClass elapsed = %f",
|
|
gos_GetHiResTime() - startTicks
|
|
));
|
|
|
|
return true;
|
|
}
|
|
|
|
//
|
|
//###########################################################################
|
|
// TestClass
|
|
//###########################################################################
|
|
//
|
|
bool
|
|
Chain::TestClass()
|
|
{
|
|
SPEW((GROUP_STUFF_TEST, "Starting Chain test..."));
|
|
|
|
ChainTestNode testNode;
|
|
|
|
testNode.RunTest();
|
|
|
|
return true;
|
|
}
|
|
|
|
//
|
|
//###########################################################################
|
|
// RunProfile
|
|
//###########################################################################
|
|
//
|
|
bool
|
|
ChainTestNode::RunProfile()
|
|
{
|
|
ChainTestPlug *testPlug1;
|
|
unsigned i;
|
|
Time startTicks;
|
|
|
|
//
|
|
//--------------------------------------------------------------------
|
|
// Run timing tests
|
|
//--------------------------------------------------------------------
|
|
//
|
|
|
|
/*
|
|
* Create plugs and add to both sockets
|
|
*/
|
|
startTicks = gos_GetHiResTime();
|
|
for (i = 0; i < TEST_COUNT; i++)
|
|
{
|
|
testPlug1 = new ChainTestPlug(i);
|
|
Register_Object( testPlug1 );
|
|
chain1.Add(testPlug1);
|
|
chain2.Add(testPlug1);
|
|
}
|
|
SPEW((
|
|
GROUP_STUFF_TEST,
|
|
"ChainTestNode::RunTest Create = %f",
|
|
gos_GetHiResTime() - startTicks
|
|
));
|
|
|
|
/*
|
|
* Iterate over both sockets
|
|
*/
|
|
startTicks = gos_GetHiResTime();
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
i = 0;
|
|
while ((testPlug1 = iterator1.ReadAndNext()) != NULL)
|
|
{
|
|
Verify( testPlug1->value == i );
|
|
i++;
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
|
|
i = 0;
|
|
while ((testPlug1 = iterator2.ReadAndNext()) != NULL)
|
|
{
|
|
Verify( testPlug1->value == i );
|
|
i++;
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
}
|
|
SPEW((
|
|
GROUP_STUFF_TEST,
|
|
"ChainTestNode::RunTest Iterate = %f",
|
|
gos_GetHiResTime() - startTicks
|
|
));
|
|
|
|
/*
|
|
* Destroy from chain1, verify with chain2
|
|
*/
|
|
startTicks = gos_GetHiResTime();
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
#if defined(_ARMOR)
|
|
i = 0;
|
|
#endif
|
|
while ((testPlug1 = iterator1.ReadAndNext()) != NULL)
|
|
{
|
|
Verify( testPlug1->value == i++ );
|
|
|
|
Unregister_Object( testPlug1 );
|
|
delete(testPlug1);
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
|
|
Verify( iterator1.GetSize() == 0 );
|
|
Verify( iterator2.GetSize() == 0 );
|
|
}
|
|
SPEW((
|
|
GROUP_STUFF_TEST,
|
|
"ChainTestNode::RunTest Destroy = %f",
|
|
gos_GetHiResTime() - startTicks
|
|
));
|
|
return true;
|
|
}
|
|
|
|
//
|
|
//###########################################################################
|
|
// RunTest
|
|
//###########################################################################
|
|
//
|
|
bool
|
|
ChainTestNode::RunTest()
|
|
{
|
|
ChainTestPlug *testPlug1, *testPlug2;
|
|
unsigned i;
|
|
// Time startTicks;
|
|
|
|
//
|
|
//--------------------------------------------------------------------
|
|
// Stress tests
|
|
//--------------------------------------------------------------------
|
|
//
|
|
|
|
/*
|
|
* Create plugs and add to both sockets
|
|
*/
|
|
for (i = 0; i < TEST_COUNT; i++)
|
|
{
|
|
testPlug1 = new ChainTestPlug(i);
|
|
Register_Object( testPlug1 );
|
|
chain1.Add(testPlug1);
|
|
chain2.Add(testPlug1);
|
|
}
|
|
|
|
/*
|
|
* Verify first and last
|
|
*/
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
iterator1.First();
|
|
iterator2.First();
|
|
|
|
testPlug1 = iterator1.GetCurrent();
|
|
testPlug2 = iterator2.GetCurrent();
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
Verify( testPlug1 == iterator1.GetNth(0) );
|
|
Verify( testPlug1 == iterator2.GetNth(0) );
|
|
|
|
iterator1.Last();
|
|
iterator2.Last();
|
|
|
|
testPlug1 = iterator1.GetCurrent();
|
|
testPlug2 = iterator2.GetCurrent();
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
Verify( testPlug1 == iterator1.GetNth(TEST_COUNT - 1) );
|
|
Verify( testPlug1 == iterator2.GetNth(TEST_COUNT - 1) );
|
|
}
|
|
|
|
/*
|
|
* Verify next and prev
|
|
*/
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
i = 0;
|
|
while ((testPlug1 = iterator1.GetCurrent()) != NULL)
|
|
{
|
|
testPlug2 = iterator2.GetCurrent();
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Verify( testPlug1->value == i );
|
|
Verify( testPlug2->value == i );
|
|
|
|
iterator1.Next();
|
|
iterator2.Next();
|
|
|
|
i++;
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
|
|
iterator1.Last();
|
|
iterator2.Last();
|
|
|
|
i = TEST_COUNT - 1;
|
|
while ((testPlug1 = iterator1.GetCurrent()) != NULL)
|
|
{
|
|
testPlug2 = iterator2.GetCurrent();
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Verify( testPlug1->value == i );
|
|
Verify( testPlug2->value == i );
|
|
|
|
iterator1.Previous();
|
|
iterator2.Previous();
|
|
|
|
i--;
|
|
}
|
|
Verify( i == -1 );
|
|
}
|
|
|
|
/*
|
|
* Verify read next and read prev
|
|
*/
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
i = 0;
|
|
while ((testPlug1 = iterator1.ReadAndNext()) != NULL)
|
|
{
|
|
testPlug2 = iterator2.ReadAndNext();
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Verify( testPlug1->value == i );
|
|
Verify( testPlug2->value == i );
|
|
|
|
i++;
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
|
|
iterator1.Last();
|
|
iterator2.Last();
|
|
|
|
i = TEST_COUNT - 1;
|
|
while ((testPlug1 = iterator1.ReadAndPrevious()) != NULL)
|
|
{
|
|
testPlug2 = iterator2.ReadAndPrevious();
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Verify( testPlug1->value == i );
|
|
Verify( testPlug2->value == i );
|
|
|
|
i--;
|
|
}
|
|
Verify( i == -1 );
|
|
}
|
|
|
|
/*
|
|
* Verify nth
|
|
*/
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
for (i = 0; i < TEST_COUNT; i++)
|
|
{
|
|
testPlug1 = iterator1.GetNth(i);
|
|
testPlug2 = iterator2.GetNth(i);
|
|
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Verify( testPlug1->value == i );
|
|
Verify( testPlug2->value == i );
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Verify Remove
|
|
*/
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
i = 0;
|
|
while ((testPlug1 = iterator1.GetCurrent()) != NULL)
|
|
{
|
|
Verify( testPlug1->value == i );
|
|
|
|
if (i % 2 == 0)
|
|
{
|
|
iterator1.Remove();
|
|
}
|
|
else
|
|
{
|
|
iterator1.Next();
|
|
|
|
chain1.Remove(testPlug1);
|
|
}
|
|
|
|
testPlug2 = iterator2.GetNth(0);
|
|
|
|
Verify( testPlug2->value == i );
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Unregister_Object( testPlug2 );
|
|
delete(testPlug2);
|
|
|
|
i++;
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
Verify( iterator1.GetSize() == 0 );
|
|
Verify( iterator2.GetSize() == 0 );
|
|
}
|
|
|
|
/*
|
|
* Verify insert
|
|
*/
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
|
|
Verify( iterator1.GetSize() == 0 );
|
|
|
|
for (i = 0; i < TEST_COUNT; i += 2)
|
|
{
|
|
testPlug1 = new ChainTestPlug(i);
|
|
Register_Object(testPlug1);
|
|
chain1.Add(testPlug1);
|
|
}
|
|
|
|
for (i = 1; i < TEST_COUNT; i += 2)
|
|
{
|
|
testPlug1 = new ChainTestPlug(i);
|
|
Register_Object(testPlug1);
|
|
|
|
iterator1.First();
|
|
while ((testPlug2 = iterator1.GetCurrent()) != NULL)
|
|
{
|
|
if (i < testPlug2->value)
|
|
{
|
|
iterator1.Insert(testPlug1);
|
|
break;
|
|
}
|
|
iterator1.Next();
|
|
}
|
|
if (testPlug2 == NULL)
|
|
{
|
|
chain1.Add(testPlug1);
|
|
}
|
|
}
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
|
|
for (i = 1; i < TEST_COUNT; i++)
|
|
{
|
|
testPlug1 = iterator1.GetNth(i);
|
|
testPlug2 = iterator1.GetNth(i-1);
|
|
|
|
Verify(testPlug2->value < testPlug1->value);
|
|
}
|
|
}
|
|
{
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
|
|
while ((testPlug1 = iterator1.GetCurrent()) != NULL)
|
|
{
|
|
Unregister_Object(testPlug1);
|
|
delete(testPlug1);
|
|
iterator1.First();
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Verify random deletion
|
|
*/
|
|
{
|
|
/*
|
|
* Add plugs to both sockets
|
|
*/
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == 0 );
|
|
Verify( iterator2.GetSize() == 0 );
|
|
|
|
for (i = 0; i < TEST_COUNT; i++)
|
|
{
|
|
testPlug1 = new ChainTestPlug(i);
|
|
Register_Object( testPlug1 );
|
|
chain1.Add(testPlug1);
|
|
chain2.Add(testPlug1);
|
|
}
|
|
}
|
|
{
|
|
int size, index;
|
|
ChainIteratorOf<ChainTestPlug*> iterator1(&chain1);
|
|
ChainIteratorOf<ChainTestPlug*> iterator2(&chain2);
|
|
|
|
Verify( iterator1.GetSize() == TEST_COUNT );
|
|
Verify( iterator2.GetSize() == TEST_COUNT );
|
|
|
|
i = 0;
|
|
while((size = iterator1.GetSize()) != 0)
|
|
{
|
|
index = Random::GetLessThan(size);
|
|
testPlug1 = iterator1.GetNth(index);
|
|
iterator1.Remove();
|
|
|
|
testPlug2 = iterator2.GetNth(index);
|
|
Verify( testPlug1 == testPlug2 );
|
|
|
|
Unregister_Object( testPlug2 );
|
|
delete(testPlug2);
|
|
|
|
i++;
|
|
}
|
|
Verify( i == TEST_COUNT );
|
|
Verify( iterator1.GetSize() == 0 );
|
|
Verify( iterator2.GetSize() == 0 );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|