[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