[ogs-changes] dist/c++/test AbilitiesTest.cpp,NONE,1.1 DieTest.cpp,NONE,1.1 ModifiersTest.cpp,NONE,1
Status: Alpha
Brought to you by:
elemings
|
From: <ele...@us...> - 2003-04-08 21:43:25
|
Update of /cvsroot/ogs/dist/c++/test
In directory sc8-pr-cvs1:/tmp/cvs-serv21226/c++/test
Modified Files:
Makefile.am
Added Files:
AbilitiesTest.cpp DieTest.cpp ModifiersTest.cpp
SupportTest.cpp
Removed Files:
CoreTest01.cpp CoreTest02.cpp CoreTest03.cpp SupportTest01.cpp
SupportTest02.cpp
Log Message:
See C++ ChangeLog (Apr 5 and 8) for details.
--- NEW FILE: AbilitiesTest.cpp ---
/*
* AbilitiesTest.cpp -- test driver for ability scores
* Copyright (C) 2002 Eric Lemings <ele...@us...>
*
* This software is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA
*
* RCS: $Id: AbilitiesTest.cpp,v 1.1 2003/04/08 21:43:15 elemings Exp $
*/
// Need to add configure checks before using <mcheck.h> and mtrace().
//#include <mcheck.h>
#include <cassert>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <vector>
#include <ogs/Support.h>
#include <ogs/core/Ability.h>
#include <ogs/core/Abilities.h>
#include <ogs/core/Modifier.h>
#include <ogs/core/Modifiers.h>
#include <ogs/core/Strength.h>
using std::cout;
using std::endl;
using namespace ogs::support;
using ogs::core::Ability;
using ogs::core::Abilities;
using ogs::core::Modifier;
using ogs::core::Modifiers;
using ogs::core::Strength;
#define TEST_DRIVER "AbilitiesTest"
/**
* An object that observes ability scores.
*/
class Foo: public Observer {
public:
void handleEvent (Event& event);
};
void Foo::handleEvent (Event& event) {
cout << "Handling event: " << event.toString () << endl;
try {
Ability& ability = dynamic_cast<Ability&> (event.getSource ());
cout << "ability.getCurrentScore () = "
<< ability.getCurrentScore () << endl;
} catch (...) {
// Ignore it.
}
}
/**
* Display the distribution of N scores for a random method. Random
* methods are like the predefined methods in the Ability class. They
* generate scores by rolling dice.
*/
template <int N>
void printDistribution (Ability::Method& method, char* name) {
Ability::Score minimumScore = 1;
Ability::Score maximumScore = 20;
std::vector<Ability::Score> scores (maximumScore);
cout << "Rolling " << name << " method " << N;
cout << " times (X = 10 rolls):" << endl;
for (int i = 0; i < N; ++i) {
scores [method (Ability::CHA) - 1]++;
}
for (int i = minimumScore - 1; i < maximumScore; ++i) {
if (scores [i] > 0) {
cout.width (2);
cout.fill (' ');
cout << i+1 << ": ";
cout.width (scores [i] / 10);
cout.fill ('X');
cout << "";
cout.width (0);
cout.fill (' ');
cout << " (" << scores [i] << ")" << endl;
}
}
cout << endl;
}
void testAbility () {
cout << "sizeof (Ability) = " << sizeof (Ability) << endl;
// In practice, this would require a cast but ya never know...
Ability::Type type = Ability::Type (0);
assert (! Ability::isValidType (type));
try {
Ability ability (type);
} catch (std::exception& e) {
cout << e.what () << endl;
}
Ability ability (Ability::CHA);
Ability::Score score = ability.getOriginalScore ();
cout << "ability.getOriginaScore () = " << score << endl;
cout << "ability.getCurrentScore () = "
<< ability.getCurrentScore () << endl;
// A new ability score has no score modifiers.
assert (ability.getOriginalScore () == ability.getCurrentScore ());
Modifier& modifier = ability.getModifier ();
cout << "&modifier = " << &modifier << endl;
cout << "modifier.getValue () = "
<< modifier.getValue () << endl;
Modifiers& modifiers = ability.getModifiers ();
Modifier array [10] = {
Modifier (-2), Modifier (+4), Modifier (+1), Modifier (),
Modifier (-1), Modifier (+5), Modifier (+2), Modifier (-3),
Modifier (+1), Modifier (0)
};
modifiers.addModifier (array [0]);
modifiers.addModifier (array [1]);
modifiers.addModifier (array [2]);
modifiers.addModifier (array [3]);
modifiers.addModifier (array [4]);
modifiers.addModifier (array [5]);
modifiers.addModifier (array [6]);
modifiers.addModifier (array [7]);
assert (ability.getCurrentScore () == score + 6);
cout << "ability.getCurrentScore () = "
<< ability.getCurrentScore () << endl;
cout << "modifier.getValue () = "
<< modifier.getValue () << endl;
Foo foo;
cout << "&foo = " << &foo << endl;
ability.addObserver (foo);
modifiers.addModifier (array [8]);
modifiers.addModifier (array [9]);
assert (ability.getCurrentScore () == score + 7);
modifiers.removeModifier (array [5]); // remove +5
modifiers.removeModifier (array [3]); // remove 0
assert (ability.getCurrentScore () == score + 2);
(array [8]).setValue (-4); // change +1 to -4
assert (ability.getCurrentScore () == score - 3);
(array [9]).setValue (+10); // change 0 to +10
assert (ability.getCurrentScore () == score + 7);
cout << endl;
}
void testStrength () {
Ability::DirectMethod directMethod (1);
Strength str (directMethod);
Modifier modifier;
(str.getModifiers ()).addModifier (modifier);
cout.width (10);
cout << "Strength";
cout.width (0);
cout << "\tLight\tMedium\tHeavy" << endl;
for (Modifier::Value value = 0; value < 50; value += 2) {
modifier.setValue (value);
cout.width (10);
cout << str.getCurrentScore () << "\t";
cout << str.getLightLoad () << "\t";
cout << str.getMediumLoad () << "\t";
cout << str.getHeavyLoad () << endl;
}
cout.width (0);
cout << endl;
}
void testPartialAbilities () {
Abilities::PartialMethod::Value dex (Ability::DEX, 16);
Abilities::PartialMethod::Value intl (Ability::INT, 14);
Abilities::PartialMethod::Value wis (Ability::WIS, 14);
Abilities::PartialMethod::Value cha (Ability::CHA, 15);
Abilities::PartialMethod::Value values [] = { dex, intl, wis, cha };
/*
Abilities::PartialMethod partialMethod (& values [0], & values [3]);
Abilities wraithAbilities (partialMethod);
assert (! wraithAbilities [Ability::STR]);
assert (wraithAbilities [Ability::DEX]);
assert (wraithAbilities [Ability::DEX]->getCurrentScore () == 16);
assert (! wraithAbilities [Ability::CON]);
assert (wraithAbilities [Ability::INT]);
assert (wraithAbilities [Ability::INT]->getCurrentScore () == 14);
assert (wraithAbilities [Ability::WIS]);
assert (wraithAbilities [Ability::WIS]->getCurrentScore () == 14);
assert (wraithAbilities [Ability::CHA]);
assert (wraithAbilities [Ability::CHA]->getCurrentScore () == 15);
*/
cout << endl;
}
/**
* Run various tests on ability scores.
*/
int main (void) {
//mtrace ();
cout << "BEGIN: " TEST_DRIVER "\n\n";
// Seed random number generator with current time.
std::srand (std::time (NULL));
Ability::StandardMethod standard;
printDistribution<1000> (standard, "standard");
Ability::AverageMethod average;
printDistribution<1000> (average, "average");
Ability::HighPoweredMethod highPowered;
printDistribution<1000> (highPowered, "high-powered");
testAbility ();
testStrength ();
testPartialAbilities ();
cout << "END: " TEST_DRIVER "\n";
//muntrace ();
return (0);
}
--- NEW FILE: DieTest.cpp ---
/*
* DieTest.cpp -- test driver for polyhedral dice
* Copyright (C) 2002 Eric Lemings <ele...@us...>
*
* This software is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA
*
* RCS: $Id: DieTest.cpp,v 1.1 2003/04/08 21:43:17 elemings Exp $
*/
// Need to add configure checks before using <mcheck.h> and mtrace().
// //#include <mcheck.h>
#include <cassert>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>
#include <ogs/core/Die.h>
using std::cout;
using std::endl;
using ogs::core::Die;
#define TEST_DRIVER "DieTest"
/**
* Display the distribution of N die rolls.
*/
template <int N>
void printDistribution (Die::Sides sides = Die::d20,
Die::Count count = 1,
Die::Modifier modifier = 0) {
Die::Value minimumRoll = count + modifier;
Die::Value maximumRoll = (sides * count) + modifier;
std::vector<Die::Value> values (maximumRoll);
cout << "Rolling " << count << "d" << sides;
cout << std::showpos << modifier << std::noshowpos << " ";
cout << N << " times (X = 10 rolls):" << endl;
for (int i = 0; i < N; ++i) {
values [Die::roll (sides, count, modifier) - 1]++;
}
for (int i = minimumRoll - 1; i < maximumRoll; ++i) {
cout.width (2);
cout.fill (' ');
cout << i+1 << ": ";
cout.width (values [i] / 10);
cout.fill ('X');
cout << "";
cout.width (0);
cout.fill (' ');
cout << " (" << values [i] << ")" << endl;
}
cout << endl;
}
void testDie () {
cout << "sizeof (Die) = " << sizeof (Die) << endl;
Die die;
assert (die.getSides () == Die::d20);
assert (die.getCount () == 1);
assert (die.getModifier () == 0);
assert (die.getMinimumValue () == 1);
assert (die.getMaximumValue () == 20);
Die::Value value = die.getValue ();
assert (value >= 1 && value <= 20);
cout << "die.getValue () = " << value << endl;
die.setSides (Die::d12);
assert (die.getSides () == Die::d12);
assert (die.getMinimumValue () == 1);
assert (die.getMaximumValue () == 12);
value = die.getValue ();
assert (value >= 1 && value <= 12);
cout << "die.getValue () = " << value << endl;
die.setCount (2);
assert (die.getCount () == 2);
assert (die.getMinimumValue () == 2);
assert (die.getMaximumValue () == 24);
value = die.getValue ();
assert (value >= 2 && value <= 24);
cout << "die.getValue () = " << value << endl;
die.setModifier (8);
assert (die.getModifier () == 8);
assert (die.getMinimumValue () == 10);
assert (die.getMaximumValue () == 32);
value = die.getValue ();
assert (value >= 10 && value <= 32);
cout << "die.getValue () = " << value << endl;
// The sides, count, and modifier of a const die can't change but it
// can still be rolled.
const Die& constDie = die;
cout << "Printing 10 rolls of 2d12+8: ";
for (int i = 0; i < 10; ++i) {
value = constDie.rollValue ();
assert (value >= 10 && value <= 32);
cout << value << " ";
}
cout << "\n\n";
}
/**
* Run various tests on polyhedral die.
*/
int main (void) {
//mtrace ();
cout << "BEGIN: " TEST_DRIVER "\n\n";
// Seed random number generator with current time.
std::srand (std::time (NULL));
printDistribution<10000> ();
printDistribution<1000> (Die::d6, 3);
printDistribution<1000> (Die::d4, 4, +4);
testDie ();
cout << "END: " TEST_DRIVER "\n";
//muntrace ();
return (0);
}
--- NEW FILE: ModifiersTest.cpp ---
/*
* ModifiersTest.cpp -- test driver for modifiers
* Copyright (C) 2002 Eric Lemings <ele...@us...>
*
* This software is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA
*
* RCS: $Id: ModifiersTest.cpp,v 1.1 2003/04/08 21:43:18 elemings Exp $
*/
// Need to add configure checks before using <mcheck.h> and mtrace().
//#include <mcheck.h>
#include <cassert>
#include <iostream>
#include <ogs/Support.h>
#include <ogs/core/Modifier.h>
#include <ogs/core/Modifiers.h>
using std::cout;
using std::endl;
using namespace ogs::support;
using ogs::core::Modifier;
using ogs::core::Modifiers;
#define TEST_DRIVER "ModifiersTest"
/**
* An object that observers modifiers.
*/
class Foo: public Observer {
public:
void handleEvent (Event& event);
};
extern void
Foo::handleEvent (Event& event) {
cout << "this = " << this << endl;;
cout << "Handling event: " << event.toString () << endl;
Modifier::Event& modEvent = dynamic_cast<Modifier::Event&> (event);
cout << "modEvent.getPreviousValue () = " <<
modEvent.getPreviousValue () << endl;
Modifier& modifier = dynamic_cast<Modifier&> (event.getSource ());
cout << "modifier.getValue () = " << modifier.getValue () << endl;
}
/**
* An object that observers modifier lists. The Foo class could observe
* both modifiers and modifier lists but in practice this probably won't
* happen.
*/
class Bar: public Observer {
public:
void handleEvent (Event& event);
};
extern void
Bar::handleEvent (Event& event) {
cout << "this = " << this << endl;;
cout << "Handling event: " << event.toString () << endl;
Modifiers::Event& modEvent = dynamic_cast<Modifiers::Event&> (event);
cout << "modEvent.getPreviousValue () = "
<< modEvent.getPreviousValue () << endl;
Modifiers::Event::Type type = modEvent.getType ();
assert (type == Modifiers::Event::ADDED ||
type == Modifiers::Event::REMOVED ||
type == Modifiers::Event::CHANGED);
cout << "modEvent.getType () = "
<< (type == Modifiers::Event::ADDED? "ADDED":
type == Modifiers::Event::REMOVED? "REMOVED": "CHANGED")
<< endl;
Modifier& modifier = modEvent.getModifier ();
cout << "modEvent.getModifier () = " << &modifier << endl;
Modifiers& modifiers = dynamic_cast<Modifiers&> (event.getSource ());
cout << "modifiers.getValue () = " << modifiers.getValue () << endl;
}
void testModifier () {
cout << "sizeof (Modifier) = " << sizeof (Modifier) << endl;
Modifier mod1;
cout << "&mod1 = " << &mod1 << endl;
cout << "mod1.toString () = " << mod1.toString () << endl;
assert (mod1.getValue () == 0);
cout << "mod1.getValue () = " << mod1.getValue () << endl;
Modifier mod2 (+2);
cout << "&mod1 = " << &mod2 << endl;
cout << "mod2.toString () = " << mod2.toString () << endl;
assert (mod2.getValue () == 2);
cout << "mod2.getValue () = " << mod2.getValue () << endl;
Foo foo;
cout << "&foo = " << &foo << endl;
mod1.addObserver (foo);
mod1.setValue (-1);
assert (mod1.getValue () == -1);
mod2.addObserver (foo);
mod2.setValue (+4);
assert (mod2.getValue () == 4);
cout << endl;
}
void testModifiers () {
// Let's pretend these modifiers are components scattered across
// several different objects and that they have many different values..
Modifier array [10] = {
Modifier (-2), Modifier (+4), Modifier (+1), Modifier (),
Modifier (-1), Modifier (+5), Modifier (+2), Modifier (-3),
Modifier (+1), Modifier (0)
};
Modifiers modifiers;
cout << "&modifiers = " << &modifiers << endl;
assert (modifiers.getValue () == 0);
cout << "modifiers.getValue () = " << modifiers.getValue ()
<< endl;
modifiers.addModifier (array [0]);
modifiers.addModifier (array [1]);
modifiers.addModifier (array [2]);
modifiers.addModifier (array [3]);
modifiers.addModifier (array [4]);
modifiers.addModifier (array [5]);
modifiers.addModifier (array [6]);
modifiers.addModifier (array [7]);
assert (modifiers.getValue () == 6);
cout << "modifiers.getValue () = " << modifiers.getValue ()
<< endl;
Bar bar;
cout << "&bar = " << &bar << endl;
modifiers.addObserver (bar);
modifiers.addModifier (array [8]);
modifiers.addModifier (array [9]);
assert (modifiers.getValue () == 7);
modifiers.removeModifier (array [5]); // remove +5
modifiers.removeModifier (array [3]); // remove 0
assert (modifiers.getValue () == 2);
(array [8]).setValue (-4); // change +1 to -4
assert (modifiers.getValue () == -3);
(array [2]).setValue (+10); // change +1 to +10
assert (modifiers.getValue () == 6);
cout << endl;
}
/**
* Run various tests on modifiers.
*/
int main (void)
{
//mtrace ();
cout << "BEGIN: " TEST_DRIVER "\n\n";
testModifier ();
testModifiers ();
cout << "END: " TEST_DRIVER "\n";
//muntrace ();
return (0);
}
--- NEW FILE: SupportTest.cpp ---
/*
* SupportTest.cpp -- test driver for library support
* Copyright (C) 2002 Eric Lemings <ele...@us...>
*
* This software is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA
*
* RCS: $Id: SupportTest.cpp,v 1.1 2003/04/08 21:43:19 elemings Exp $
*/
// Need to add configure checks before using <mcheck.h> and mtrace().
//#include <mcheck.h>
#include <cassert>
#include <iostream>
#include <string>
#include <ogs/Support.h>
using std::cout;
using std::endl;
using std::string;
using namespace ogs::support;
#define TEST_DRIVER "SupportTest"
/**
* Foo is a simple object class with one simple name attribute and an
* event for notifying observers of changes to this name.
*/
class Foo: public Object {
public:
class Event;
Foo (const string& name = "");
string getName () const;
void setName (string name);
private:
string _name;
};
/**
* An event that provides observers of Foo objects with the previous
* name. Note that the constructor is private: Foo events can only
* be created by the Foo::setName() function. Foo events must be
* created before the name is actually changed!
*/
class Foo::Event: public ogs::support::Event {
public:
string getPreviousName () const;
private:
string _name;
Event (Foo& foo);
friend void Foo::setName (string name);
};
inline Foo::Foo (const string& name):
Object (), _name (name) {
// empty constructor body
}
inline string
Foo::getName () const {
return (this->_name);
}
extern void
Foo::setName (string name) {
Event event (*this);
this->_name = name;
notifyObservers (event);
}
inline Foo::Event::Event (Foo& foo):
ogs::support::Event (foo), _name (foo.getName ()) {
// empty constructor body
}
inline string
Foo::Event::getPreviousName () const {
return (this->_name);
}
OGS_BEGIN_SUPPORT_NAMESPACE
/**
* An object that observers Foo objects. Note that this class is in the
* ogs::support namespace. Yeah, it's ludicrous but it's just to check
* the compiler for namespace support.
*/
class Bar: public Observer {
public:
void handleEvent (Event& event);
};
extern void
Bar::handleEvent (Event& event) {
cout << "this = " << this << endl;;
cout << "Handling event: " << event.toString () << endl;
Foo::Event& fooEvent = dynamic_cast<Foo::Event&> (event);
cout << "fooEvent.getPreviousName () = \"" <<
fooEvent.getPreviousName () << "\"" << endl;
Foo& foo = dynamic_cast<Foo&> (event.getSource ());
cout << "foo.getName () = " << foo.getName () << endl;
}
OGS_END_SUPPORT_NAMESPACE
/**
* Test the Object and Class classes.
*/
void testObjectClass () {
Foo foo;
cout << "foo = " << &foo << endl;
cout << "sizeof (foo) = " << sizeof (foo) << endl;
cout << "foo.toString () = " << foo.toString () << endl;
cout << "foo.getName () = \"" << foo.getName () << "\"\n";
//ogs::support::Class cls; // Error: private constructor
Class fooCls = foo.getClass (); // operator=
cout << "fooCls = " << &fooCls << endl;
cout << "sizeof (fooCls) = " << sizeof (fooCls) << endl;
cout << "fooCls.getName () = " << fooCls.getName () << endl;
Foo bigFoo;
Class bigCls (bigFoo.getClass ()); // copy constructor
cout << "bigCls = " << &bigCls << endl;
cout << "bigCls.getName () = " << bigCls.getName () << endl;
assert (fooCls == bigCls); // operator==
cout << endl;
}
/**
* Test the Event and Observer cclasses.
*/
void testEventObserver () {
Foo foo;
cout << "&foo = " << &foo << endl;
Bar obs1;
cout << "&obs1 = " << &obs1 << endl;
foo.addObserver (obs1);
Bar obs2;
cout << "&obs2 = " << &obs2 << endl;
foo.addObserver (obs2);
// Trigger event.
foo.setName ("first name");
foo.removeObserver (obs1);
foo.setName ("second name");
cout << endl;
}
/**
* Test the Library Support classes.
*/
int main (void) {
//mtrace ();
cout << "BEGIN: " TEST_DRIVER "\n\n";
testObjectClass ();
testEventObserver ();
cout << "END: " TEST_DRIVER "\n";
//muntrace ();
return (0);
}
Index: Makefile.am
===================================================================
RCS file: /cvsroot/ogs/dist/c++/test/Makefile.am,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** Makefile.am 8 Mar 2003 01:08:51 -0000 1.3
--- Makefile.am 8 Apr 2003 21:43:18 -0000 1.4
***************
*** 33,53 ****
# These programs are not built until the check target is run.
check_PROGRAMS = \
! SupportTest01 \
! SupportTest02 \
! CoreTest01 \
! CoreTest02 \
! CoreTest03 \
CombatTest01
! SupportTest01_SOURCES = \
! SupportTest01.cpp
! SupportTest02_SOURCES = \
! SupportTest02.cpp
! CoreTest01_SOURCES = \
! CoreTest01.cpp
! CoreTest02_SOURCES = \
! CoreTest02.cpp
! CoreTest03_SOURCES = \
! CoreTest03.cpp
CombatTest01_SOURCES = \
CombatTest01.cpp
--- 33,50 ----
# These programs are not built until the check target is run.
check_PROGRAMS = \
! SupportTest \
! ModifiersTest \
! DieTest \
! AbilitiesTest \
CombatTest01
! SupportTest_SOURCES = \
! SupportTest.cpp
! ModifiersTest_SOURCES = \
! ModifiersTest.cpp
! DieTest_SOURCES = \
! DieTest.cpp
! AbilitiesTest_SOURCES = \
! AbilitiesTest.cpp
CombatTest01_SOURCES = \
CombatTest01.cpp
--- CoreTest01.cpp DELETED ---
--- CoreTest02.cpp DELETED ---
--- CoreTest03.cpp DELETED ---
--- SupportTest01.cpp DELETED ---
--- SupportTest02.cpp DELETED ---
|