[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