[Avida-SVN] r2229 - / development/source/analyze extras/source/testsuites extras/source/tools

kaben at myxo.css.msu.edu kaben at myxo.css.msu.edu
Wed Dec 19 12:23:02 PST 2007


Author: kaben
Date: 2007-12-19 15:23:02 -0500 (Wed, 19 Dec 2007)
New Revision: 2229

Added:
   extras/source/testsuites/nMemTracker.cpp
   extras/source/tools/cMemTracker.cpp
   extras/source/tools/cMemTracker.h
Modified:
   /
   development/source/analyze/cAnalyze.cc
   development/source/analyze/cAnalyze.h
   extras/source/testsuites/nAnalyze.cpp
   extras/source/testsuites/nAnalyzeGenotype.cpp
Log:
 r2191 at vallista:  kaben | 2007-11-05 22:51:18 -0800
 Refactored cMemTracker and tests into own files; fixed bug: source files now no longer include nonexistent file "cTestingWorldDriver.h".
 



Property changes on: 
___________________________________________________________________
Name: svk:merge
   - 079b078a-dbed-46b9-b3da-37668d4295ca:/avida/xcode-test:1653
c457ea80-0a68-11dc-9323-a45eea2efad5:/private:2187
   + 079b078a-dbed-46b9-b3da-37668d4295ca:/avida/xcode-test:1653
c457ea80-0a68-11dc-9323-a45eea2efad5:/private:2191

Modified: development/source/analyze/cAnalyze.cc
===================================================================

Modified: development/source/analyze/cAnalyze.h
===================================================================

Modified: extras/source/testsuites/nAnalyze.cpp
===================================================================
--- extras/source/testsuites/nAnalyze.cpp	2007-12-19 20:20:14 UTC (rev 2228)
+++ extras/source/testsuites/nAnalyze.cpp	2007-12-19 20:23:02 UTC (rev 2229)
@@ -14,6 +14,7 @@
 #include "cDriverManager.h"
 #include "cHardwareManager.h"
 #include "cIntegratedSchedule.h"
+#include "cMemTracker.h"
 #include "cMerit.h"
 #include "cOrganism.h"
 #include "cProbSchedule.h"
@@ -137,7 +138,9 @@
       {
         SetTracker(in.Tracker());
         Expect(in.ShowMark());
-        return *this;
+      } else {
+        ERROR("couldn't find root of subtree -");
+        return;
       }
       cCheckpoint()
       : m_tracker(0)
@@ -3812,6 +3815,8 @@
     cout << "what's wrong, move this test to reflect the" << endl;
     cout << "source of the bug. @kgn" << endl;
     cout << "XXX This is a test demo. It needs filling-in. @kgn" << endl;
+  cAddTestSuite t("cAnalyze_UnitTest_cAvidaConfigDestruction", testsuite);
+}
 
     char * argv[] = {
       "cAnalyze_UnitTest_Destructor",

Modified: extras/source/testsuites/nAnalyzeGenotype.cpp
===================================================================

Added: extras/source/testsuites/nMemTracker.cpp
===================================================================
--- extras/source/testsuites/nMemTracker.cpp	                        (rev 0)
+++ extras/source/testsuites/nMemTracker.cpp	2007-12-19 20:23:02 UTC (rev 2229)
@@ -0,0 +1,197 @@
+/*
+ *  nMemTracker.cpp
+ *  Avida at vallista
+ *
+ *  Created by Kaben Nanlohy on 2007.06.11.
+ *  Copyright 2007 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#include "cMemTracker.h"
+
+#include "cTestLib.h"
+
+
+namespace cMemTracker_UnitTest {
+#if USE_tMemTrack
+  class cNul {
+    tMemTrack<cNul> mt;
+  };
+#endif
+  void testsuite(){
+#if !USE_tMemTrack
+    SKIP("Test skipped because USE_tMemTrack is not enabled");
+#else
+    /*
+    Verifies REGISTER_INSTANCE_TRACKER Macro
+    Verifies cMemTracker::Instances()
+    */
+    {
+      cMemTracker tmt;
+
+      TEST(-1 == tmt.Instances("cNul"));
+
+      /*
+      Verifies REGISTER_INSTANCE_TRACKER Macro
+      */
+      REGISTER_INSTANCE_TRACKER(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"));
+
+      REGISTER_INSTANCE_TRACKER(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"));
+
+      REGISTER_INSTANCE_TRACKER(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"));
+
+      REGISTER_INSTANCE_TRACKER(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"));
+
+      REGISTER_INSTANCE_TRACKER(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"));
+
+      REGISTER_INSTANCE_TRACKER(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
+  }
+  cAddTestSuite t("cMemTracker_UnitTest", testsuite);
+}
\ No newline at end of file

Added: extras/source/tools/cMemTracker.cpp
===================================================================
--- extras/source/tools/cMemTracker.cpp	                        (rev 0)
+++ extras/source/tools/cMemTracker.cpp	2007-12-19 20:23:02 UTC (rev 2229)
@@ -0,0 +1,129 @@
+/*
+ *  cMemTracker.cpp
+ *  Avida at vallista
+ *
+ *  Created by Kaben Nanlohy on 2007.06.11.
+ *  Copyright 2007 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#ifndef cMemTracker_h
+#include "cMemTracker.h"
+#endif
+
+
+/*
+Implementation of cMemTracker::cCheckpoint.
+*/
+
+tTracker cMemTracker::cCheckpoint::Tracker(){
+  return m_tracker;
+}
+
+int cMemTracker::cCheckpoint::Instances(){
+  if(m_tracker) return (*m_tracker)(0);
+  return -1;
+}
+
+void cMemTracker::cCheckpoint::SetTracker(tTracker tracker){
+  m_tracker = tracker;
+}
+
+void cMemTracker::cCheckpoint::Mark(){
+  m_marks = Instances();
+}
+
+void cMemTracker::cCheckpoint::Expect(int count){
+  m_marks = count;
+}
+
+int cMemTracker::cCheckpoint::ShowMark(){
+  return m_marks;
+}
+
+bool cMemTracker::cCheckpoint::Verify(){
+  return (Tracker()) && (ShowMark() == Instances());
+}
+
+cMemTracker::cCheckpoint&
+cMemTracker::cCheckpoint::operator=(cCheckpoint & in)
+{
+  SetTracker(in.Tracker());
+  Expect(in.ShowMark());
+  return *this;
+}
+
+cMemTracker::cCheckpoint::cCheckpoint()
+: m_tracker(0)
+, m_marks(-1)
+{}
+
+cMemTracker::cCheckpoint::cCheckpoint(const cCheckpoint &c)
+: m_tracker(c.m_tracker)
+, m_marks(c.m_marks)
+{}
+
+cMemTracker::cCheckpoint::cCheckpoint(tTracker tracker)
+: m_tracker(tracker)
+, m_marks(0)
+{
+  /*
+  FIXME at kgn
+  bugfix : tracker can be 0, in which case we need to set
+  m_marks to -1. @kgn
+  */
+  Expect(ShowMark());
+}
+
+
+/*
+Implementation of cMemTracker.
+*/
+
+cMemTracker& 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");
+    }
+  }
+}

Added: extras/source/tools/cMemTracker.h
===================================================================
--- extras/source/tools/cMemTracker.h	                        (rev 0)
+++ extras/source/tools/cMemTracker.h	2007-12-19 20:23:02 UTC (rev 2229)
@@ -0,0 +1,177 @@
+/*
+ *  cMemTracker.h
+ *  Avida at vallista
+ *
+ *  Created by Kaben Nanlohy on 2007.06.11.
+ *  Copyright 2007 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#ifndef cMemTracker_h
+#define cMemTracker_h
+
+#ifndef cString_h
+#include "cString.h"
+#endif
+#ifndef cTestLib_h
+#include "cTestLib.h"
+#endif
+#ifndef tDictionary_h
+#include "tDictionary.h"
+#endif
+#ifndef tList_h
+#include "tList.h"
+#endif
+
+
+#define REGISTER_INSTANCE_TRACKER(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();
+  public:
+    int Instances();
+    void SetTracker(tTracker tracker);
+    void Mark();
+    void Expect(int count);
+    int ShowMark();
+    bool Verify();
+
+    cCheckpoint& operator=(cCheckpoint & in);
+    cCheckpoint();
+    cCheckpoint(const cCheckpoint &c);
+    cCheckpoint(tTracker tracker);
+  };
+protected:
+  tDictionary<cCheckpoint> m_tracker_dict;
+public:
+  cMemTracker& operator=(const cMemTracker &in);
+  cMemTracker(){}
+  cMemTracker(const cMemTracker &in);
+  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());
+      std::cout << ShowMark(name) << " marked instances of " << name << std::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());
+      std::cout << Instances(name) << " instances of " << name << std::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");
+        std::cerr << ShowMark(name) << " marked instances of " << name << std::endl;
+        std::cerr << Instances(name) << " instances of " << name << std::endl;
+        failures++;
+      }
+    }
+    return 0 == failures;
+  }
+};
+
+#endif




More information about the Avida-cvs mailing list