[Avida-SVN] r1134 - in extras: . source/testsuites source/tools
avidaedward at myxo.css.msu.edu
avidaedward at myxo.css.msu.edu
Mon Dec 11 19:36:07 PST 2006
Author: avidaedward
Date: 2006-12-11 22:36:07 -0500 (Mon, 11 Dec 2006)
New Revision: 1134
Modified:
extras/
extras/SConscript
extras/source/testsuites/nAnalyze.cpp
extras/source/tools/cTestDriver.cpp
extras/source/tools/cTestDriver.h
extras/source/tools/cTestLib.h
Log:
r1145 at Kaben-Nanlohys-MacBook-Pro-15: kaben | 2006-12-11 22:41:47 -0500
Discovery: driver objects take ownership of world objects; i.e., driver
deletes world object.
Property changes on: extras
___________________________________________________________________
Name: svk:merge
- 079b078a-dbed-46b9-b3da-37668d4295ca:/avida/local/extras:1137
+ 079b078a-dbed-46b9-b3da-37668d4295ca:/avida/local/extras:1145
Modified: extras/SConscript
===================================================================
--- extras/SConscript 2006-12-12 03:36:05 UTC (rev 1133)
+++ extras/SConscript 2006-12-12 03:36:07 UTC (rev 1134)
@@ -111,7 +111,7 @@
'source/testsuites/nAnalyze.cpp',
# For unknown reasons, scons is not happy if the following file is
# renamed to "nAnalyzeGenotype.cpp". @kgn
- 'source/testsuites/nBlah.cpp',
+ 'source/testsuites/nIck.cpp',
# "nAGenotype.cpp" doesn't work either. @kgn
'source/testsuites/nChangeList.cpp',
'source/testsuites/nDataEntry.cpp',
Modified: extras/source/testsuites/nAnalyze.cpp
===================================================================
--- extras/source/testsuites/nAnalyze.cpp 2006-12-12 03:36:05 UTC (rev 1133)
+++ extras/source/testsuites/nAnalyze.cpp 2006-12-12 03:36:07 UTC (rev 1134)
@@ -8,12 +8,37 @@
#include "cTestLib.h"
#include "cXMLArchive.h"
#include "cWorld.h"
+#include "tDictionary.h"
+#if USE_tMemTrack
+# ifndef tMemTrack_h
+# include "tMemTrack.h"
+# endif
+#endif
+
+
#include <iostream>
#include <fstream>
+#include <assert.h>
+
using namespace std;
+class cActionLibrary;
+class cAnalyze;
+class cAvidaConfig;
+class cAvidaContext;
+class cClassificationManager;
+class cDataFileManager;
+class cEnvironment;
+class cEventList;
+class cHardwareManager;
+class cPopulation;
+class cStats;
+class cWorldDriver;
+
+class cRandom m_rng;
+
/* Tests. */
namespace nAnalyze {
/* Test-helpers. {{{1 */
@@ -51,27 +76,529 @@
/* cAnalyze_Brainstorm_RunningAnalyze {{{2 */
namespace Brainstorm_RunningAnalyze {
+
+# define RIT(mt, class_name) \
+ (mt).RegTracker( \
+ (#class_name), \
+ (tMemTrack< class_name >::Instances) \
+ )
+
+ typedef int (*tTracker)(int);
+ class cMemTracker {
+ protected:
+ class cCheckpoint {
+ protected:
+ tTracker m_tracker;
+ int m_marks;
+ protected:
+ tTracker Tracker(){ return m_tracker; }
+ public:
+ int Instances(){
+ if(m_tracker) return (*m_tracker)(0);
+ return -1;
+ }
+ void SetTracker(tTracker tracker){ m_tracker = tracker; }
+ void Mark(){
+ m_marks = Instances();
+ }
+ void Expect(int count){ m_marks = count; }
+ int ShowMark(){ return m_marks; }
+ bool Verify(){
+ return (Tracker()) && (ShowMark() == Instances());
+ }
+
+ cCheckpoint& operator=(cCheckpoint & in)
+ {
+ SetTracker(in.Tracker());
+ Expect(in.ShowMark());
+ return *this;
+ }
+ cCheckpoint()
+ : m_tracker(0)
+ , m_marks(-1)
+ {}
+ cCheckpoint(const cCheckpoint &c)
+ : m_tracker(c.m_tracker)
+ , m_marks(c.m_marks)
+ {}
+ cCheckpoint(tTracker tracker)
+ : m_tracker(tracker)
+ , m_marks(0)
+ {
+ /*
+ bugfix : tracker can be 0, in which case we need to set
+ m_marks to -1. @kgn
+ */
+ Expect(ShowMark());
+ }
+ };
+ protected:
+ tDictionary<cCheckpoint> m_tracker_dict;
+ public:
+ cMemTracker& operator=(const cMemTracker &in){
+ /* Empty current dictionary */
+ {
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+ while (list_it.Next() != 0) {
+ cString name(*list_it.Get());
+ m_tracker_dict.Remove(name);
+ }
+ }
+ /* Copy input dictionary */
+ {
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ in.m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+ while (list_it.Next() != 0) {
+ cString name(*list_it.Get());
+ cCheckpoint c;
+ if(in.m_tracker_dict.Find(name, c)){
+ m_tracker_dict.SetValue(name, c);
+ } else {
+ ERROR(name + " missing from input cMemTracker instance");
+ }
+ }
+ }
+ return *this;
+ }
+ cMemTracker(){}
+ cMemTracker(const cMemTracker &in){
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ in.m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+
+ while (list_it.Next() != 0) {
+ cString name(*list_it.Get());
+ cCheckpoint c;
+ if(in.m_tracker_dict.Find(name, c)){
+ m_tracker_dict.SetValue(name, c);
+ } else {
+ ERROR(name + " missing from input cMemTracker instance");
+ }
+ }
+ }
+ void RegTracker(const cString &name, tTracker tracker){
+ m_tracker_dict.SetValue(name, tracker);
+ }
+ int Instances(const cString &n){
+ cString name(n);
+ cCheckpoint c;
+ if(m_tracker_dict.Find(name, c)){
+ return c.Instances();
+ } else {
+ return -1;
+ }
+ }
+ int ShowMark(const cString &n){
+ cString name(n);
+ cCheckpoint c;
+ if(m_tracker_dict.Find(name, c)){
+ return c.ShowMark();
+ } else {
+ return -1;
+ }
+ }
+ bool Mark(const cString &n){
+ cString name(n);
+ cCheckpoint c;
+ if(m_tracker_dict.Find(name, c)){
+ c.Mark();
+ m_tracker_dict.SetValue(name, c);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ bool Expect(const cString &n, int i){
+ cString name(n);
+ cCheckpoint c;
+ if(m_tracker_dict.Find(name, c)){
+ c.Expect(i);
+ m_tracker_dict.SetValue(name, c);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ bool IncMark(const cString &n, int i){
+ cString name(n);
+ cCheckpoint c;
+ if(m_tracker_dict.Find(name, c)){
+ c.Expect(c.ShowMark() + i);
+ m_tracker_dict.SetValue(name, c);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ bool Verify(const cString &n){
+ cString name(n);
+ cCheckpoint c;
+ if(m_tracker_dict.Find(name, c)){
+ return c.Verify();
+ } else {
+ ERROR(name + " is not being tracked");
+ return false;
+ }
+ }
+
+ void ShowMarks(){
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+
+ while (list_it.Next() != 0) {
+ cString name(*list_it.Get());
+ cout << ShowMark(name) << " marked instances of " << name << endl;
+ }
+ }
+ void MarkAll(){
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+
+ while (list_it.Next() != 0) { Mark(*list_it.Get()); }
+ }
+ void Report(){
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+
+ while (list_it.Next() != 0) {
+ cString name(*list_it.Get());
+ cout << Instances(name) << " instances of " << name << endl;
+ }
+ }
+ bool Verify(){
+ tList<cString> name_list;
+ tList<cCheckpoint> value_list;
+ m_tracker_dict.AsLists(name_list, value_list);
+ tListIterator<cString> list_it(name_list);
+
+ int failures = 0;
+ while (list_it.Next() != 0) {
+ cString name(*list_it.Get());
+ if(!Verify(name)){
+ ERROR(name + " has unexpected instance count");
+ cerr << ShowMark(name) << " marked instances of " << name << endl;
+ cerr << Instances(name) << " instances of " << name << endl;
+ failures++;
+ }
+ }
+ return 0 == failures;
+ }
+ };
+
+#if USE_tMemTrack
+ class cNul {
+ tMemTrack<cNul> mt;
+ };
+#endif
+
void test(){
cout << "XXX This is a test stub. It needs filling-in. @kgn" << endl;
+
+ /*
+ Tests of cMemTracker.
+ */
+#if USE_tMemTrack
+ /*
+ Verifies RIT Macro
+ Verifies cMemTracker::Instances()
+ */
+ {
+ cMemTracker tmt;
+
+ TEST(-1 == tmt.Instances("cNul"));
+
+ /*
+ Verifies RIT Macro
+ */
+ RIT(tmt, cNul);
+
+ /*
+ Verifies cMemTracker::Instances()
+ */
+ TEST(0 == tmt.Instances("cNul"));
+
+ cNul n;
+
+ TEST(1 == tmt.Instances("cNul"));
+ }
+ /*
+ Verifies cMemTracker::Mark()
+ Verifies cMemTracker::ShowMark()
+ */
+ {
+ cMemTracker tmt;
+
+ TEST(-1 == tmt.Instances("cNul"));
+ TEST(-1 == tmt.ShowMark("cNul"));
+
+ RIT(tmt, cNul);
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt.Instances("cNul"));
+
+ cNul n;
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.Mark("cNul");
+
+ TEST(1 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+ }
+ /*
+ Verifies cMemTracker::Expect()
+ */
+ {
+ cMemTracker tmt;
+
+ TEST(-1 == tmt.Instances("cNul"));
+ TEST(-1 == tmt.ShowMark("cNul"));
+
+ RIT(tmt, cNul);
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt.Instances("cNul"));
+
+ cNul n;
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.Expect("cNul", 1);
+
+ TEST(1 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+ }
+ /*
+ Verifies cMemTracker::IncMark()
+ */
+ {
+ cMemTracker tmt;
+
+ TEST(-1 == tmt.Instances("cNul"));
+ TEST(-1 == tmt.ShowMark("cNul"));
+
+ RIT(tmt, cNul);
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt.Instances("cNul"));
+
+ cNul n;
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.IncMark("cNul", 1);
+
+ TEST(1 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.IncMark("cNul", 2);
+
+ TEST(3 == tmt.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+ }
+ /*
+ Verifies cMemTracker copy constructor
+ */
+ {
+ cMemTracker tmt;
+
+ TEST(-1 == tmt.Instances("cNul"));
+ TEST(-1 == tmt.ShowMark("cNul"));
+
+ RIT(tmt, cNul);
+
+ cMemTracker tmt2(tmt);
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(0 == tmt.Instances("cNul"));
+
+ cNul n;
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.IncMark("cNul", 1);
+
+ TEST(1 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.IncMark("cNul", 2);
+
+ TEST(3 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+ }
+ /*
+ Verifies cMemTracker assignment operator
+ */
+ {
+ cMemTracker tmt;
+
+ TEST(-1 == tmt.Instances("cNul"));
+ TEST(-1 == tmt.ShowMark("cNul"));
+
+ RIT(tmt, cNul);
+
+ cMemTracker tmt2 = tmt;
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(0 == tmt.Instances("cNul"));
+
+ cNul n;
+
+ TEST(0 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.IncMark("cNul", 1);
+
+ TEST(1 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+
+ tmt.IncMark("cNul", 2);
+
+ TEST(3 == tmt.ShowMark("cNul"));
+ TEST(0 == tmt2.ShowMark("cNul"));
+ TEST(1 == tmt.Instances("cNul"));
+ }
+#endif
+
+#if USE_tMemTrack
+ cMemTracker mt;
+ RIT(mt, cActionLibrary);
+ RIT(mt, cAnalyze);
+ RIT(mt, cAvidaConfig);
+ RIT(mt, cAvidaContext);
+ RIT(mt, cClassificationManager);
+ RIT(mt, cDataFileManager);
+ RIT(mt, cDefaultAnalyzeDriver);
+ RIT(mt, cEnvironment);
+ RIT(mt, cEventList);
+ RIT(mt, cHardwareManager);
+ RIT(mt, cPopulation);
+ RIT(mt, cRandom);
+ RIT(mt, cStats);
+ RIT(mt, cWorld);
+ RIT(mt, cWorldDriver);
+
+ mt.MarkAll();
+#endif
+ ERROR("kgn at FIXME: test outcome varies with random seed");
char * argv[] = {
"cAnalyze_Brainstorm_RunningAnalyze",
+ "-s",
+ "100",
};
int argc = sizeof(argv)/sizeof(char *);
cDriverManager::Initialize();
+#if USE_tMemTrack
+ if(true){
+ TEST(mt.Verify());
+ mt.Report();
+ }
+#endif
+
cWorld *world = new cWorld(
cAvidaConfig::LoadWithCmdLineArgs(argc, argv)
);
+
+#if USE_tMemTrack
+ if(true){
+ mt.IncMark("cAvidaConfig", 1);
+ mt.IncMark("cAvidaContext", 1);
+ mt.IncMark("cClassificationManager", 1);
+ mt.IncMark("cDataFileManager", 1);
+ mt.IncMark("cEnvironment", 1);
+ mt.IncMark("cEventList", 1);
+ mt.IncMark("cHardwareManager", 1);
+ mt.IncMark("cPopulation", 1);
+ mt.IncMark("cRandom", 2);
+ mt.IncMark("cStats", 1);
+ mt.IncMark("cWorld", 1);
+ mt.IncMark("cWorldDriver", 1);
+
+ TEST(mt.Verify());
+ }
+#endif
cAvidaDriver* driver = new cDefaultAnalyzeDriver(
world,
(world->GetConfig().ANALYZE_MODE.Get() == 2)
);
+#if USE_tMemTrack
+ if(true){
+ mt.IncMark("cDefaultAnalyzeDriver", 1);
+
+ TEST(mt.Verify());
+ }
+#endif
driver->Run();
+#if USE_tMemTrack
+ if(true){
+ mt.IncMark("cAnalyze", 1);
+ ERROR("kgn at FIXME: cAvidaContext instance ct varies with random seed");
+ mt.IncMark("cAvidaContext", 2);
+ mt.IncMark("cRandom", 17);
- delete driver;
- delete world;
+ TEST(mt.Verify());
+ }
+#endif
+ /*
+ FIXME : driver currently deletes world.
+ */
+ ERROR("kgn at FIXME: driver deletes world. is this intended?");
+ TEST(driver); delete driver; driver=0;
+#if USE_tMemTrack
+ if(true){
+ mt.IncMark("cAnalyze", -1);
+ mt.IncMark("cAvidaConfig", -1);
+ ERROR("kgn at FIXME: cAvidaContext instance ct varies with random seed");
+ mt.IncMark("cAvidaContext", -2);
+ ERROR("kgn at FIXME: cClassificationManager instance ct varies with random seed");
+ mt.IncMark("cClassificationManager", -1);
+ mt.IncMark("cDataFileManager", -1);
+ mt.IncMark("cEnvironment", -1);
+ mt.IncMark("cEventList", -1);
+ mt.IncMark("cHardwareManager", -1);
+ mt.IncMark("cPopulation", -1);
+ mt.IncMark("cRandom", -3);
+ mt.IncMark("cStats", -1);
+ mt.IncMark("cWorld", -1);
+ mt.IncMark("cWorldDriver", -1);
+ mt.IncMark("cDefaultAnalyzeDriver", -1);
+
+ TEST(mt.Verify());
+ mt.Report();
+ }
+#endif
+
+ //TEST(world); delete world; world=0;
+
+#if USE_tMemTrack
+ if(false){
+ TEST(mt.Verify());
+ }
+#endif
}
cAddTestSuite t("cAnalyze_Brainstorm_RunningAnalyze", test);
}
@@ -222,7 +749,7 @@
cout << "XXX This is a test stub. It needs filling-in. @kgn" << endl;
char * argv[] = {
- "cAnalyze_Brainstorm_RunningAnalyze",
+ "cAnalyze_UnitTest_Destructor",
"-c", "gcs_avida.cfg",
};
int argc = sizeof(argv)/sizeof(char *);
@@ -243,8 +770,11 @@
driver->Run();
+ /*
+ FIXME : driver currently deletes world.
+ */
delete driver;
- delete world;
+ //delete world;
}
cAddTestSuite t("cAnalyze_UnitTest_Destructor", test);
}
Modified: extras/source/tools/cTestDriver.cpp
===================================================================
--- extras/source/tools/cTestDriver.cpp 2006-12-12 03:36:05 UTC (rev 1133)
+++ extras/source/tools/cTestDriver.cpp 2006-12-12 03:36:07 UTC (rev 1134)
@@ -20,7 +20,7 @@
return report_errors();
}
-int cTestDriver::TestAll(cStringList &attrs){
+void cTestDriver::TestAll(cStringList &attrs){
cout << "------ Running all known tests ..." << endl;
{
/* Get a list of names of known test suites. */
Modified: extras/source/tools/cTestDriver.h
===================================================================
--- extras/source/tools/cTestDriver.h 2006-12-12 03:36:05 UTC (rev 1133)
+++ extras/source/tools/cTestDriver.h 2006-12-12 03:36:07 UTC (rev 1134)
@@ -12,7 +12,7 @@
int & testErrors(void);
void resetTestErrors(void);
int reportErrors(void);
- int TestAll(cStringList &attrs);
+ void TestAll(cStringList &attrs);
int Tests(cStringList &args);
int Tests(int argc, char * argv[]);
};
Modified: extras/source/tools/cTestLib.h
===================================================================
--- extras/source/tools/cTestLib.h 2006-12-12 03:36:05 UTC (rev 1133)
+++ extras/source/tools/cTestLib.h 2006-12-12 03:36:07 UTC (rev 1134)
@@ -19,6 +19,7 @@
tDictionary<Testrunner> m_test_runners;
tDictionary<TestrunnerWithAttrs> m_test_runners_with_attributes;
public:
+ virtual ~cTestLib(){}
bool reg(const cString &key, Testrunner test_runner);
bool reg(const cString &key, TestrunnerWithAttrs test_runner);
bool unreg(const cString &key);
More information about the Avida-cvs
mailing list