openModeller  Version 1.4.0
test_ruleset.cpp
Go to the documentation of this file.
00001 
00031 #include <TestHarness.h>
00032 #include <ruleset.hh>
00033 #include <rules_base.hh>
00034 
00035 class DummyRule : public GarpRule
00036 {
00037 public:
00038   DummyRule(int id = -1);
00039   GarpRule * objFactory() const { return new DummyRule(); } 
00040   int getStrength(const Sample&) const {}
00041   double getValue(const Sample&) const {}
00042   bool applies(const Sample&) const {}
00043 
00044   int getId() { return _id; }
00045   void setPerformance(PerfIndex index, double newPerf) { _performance[index] = newPerf; }
00046 
00047 private:
00048   int _id;
00049 };
00050 
00051 DummyRule::DummyRule(int id) : GarpRule()
00052 { 
00053   _id = id; 
00054 }
00055 
00056 // dummy implementation of GarpRule methods
00057 GarpRule::GarpRule() :
00058   _numGenes(0),
00059   _prediction(0),
00060   _needsEvaluation(true),
00061   _chrom1(), 
00062   _chrom2()
00063 {
00064   _origin = type();
00065   for (int i = 0; i < 10; i++)
00066     _performance[i] = 0.0;
00067 }
00068 
00069 double GarpRule::getPerformance(PerfIndex perfIndex) const
00070 {
00071   return _performance[perfIndex];
00072 }
00073 
00074 GarpRule::~GarpRule() {};
00075 GarpRule * GarpRule::clone() const { g_log("Cl"); };
00076 int GarpRule::copy(const GarpRule * fromRule) { g_log("Cp"); };
00077 int GarpRule::getCertainty(Scalar pred) const { g_log("Ct"); };
00078 double GarpRule::getError(Scalar predefinedValue, Scalar pred) const { g_log("Er"); };
00079 void GarpRule::adjustRange(Scalar& v1, Scalar& v2) const { g_log("Ad"); };
00080 void GarpRule::crossover(GarpRule * rule, int xpt1, int xpt2) { g_log("Co"); };
00081 void GarpRule::mutate(double temperature) { g_log("Mu"); };
00082 bool GarpRule::similar(const GarpRule * objOtherRule) const { g_log("Si"); };
00083 double GarpRule::evaluate(const OccurrencesPtr& occs) { g_log("Ev"); };
00084 void GarpRule::log() {};
00085 
00086 void testHelperAddRules(GarpRuleSet * ruleset, int from, int to)
00087 {
00088   int i;
00089   DummyRule * r;
00090 
00091   for (i = from; i <= to; i++)
00092     {
00093       r = new DummyRule(i);
00094       ruleset->add(r);
00095     }
00096 }
00097 
00098 // check function testHelperAddRules
00099 TEST( testHelperAddRules , Global )
00100 {
00101   DummyRule * rule;
00102   GarpRuleSet ruleset(100);
00103   testHelperAddRules(&ruleset, 0, 99);
00104 
00105   // check number of rules and if there is a rule in there
00106   LONGS_EQUAL(100, ruleset.numRules());
00107   rule = (DummyRule *) ruleset.get(49);
00108   LONGS_EQUAL(49, rule->getId());
00109 }
00110 
00111 // tests default constructor
00112 TEST( GarpRuleSet_Constructor , GarpRuleSet )
00113 {
00114   GarpRuleSet ruleset(10);
00115   LONGS_EQUAL(10, ruleset.size());
00116   LONGS_EQUAL(0, ruleset.numRules());
00117 }
00118 
00119 // test addition and deletion of rules from ruleset
00120 TEST( GarpRuleSet_add , Garp)
00121 {
00122   DummyRule * r0, * r1, * r2, * r3;
00123 
00124   r0 = new DummyRule(0);
00125   r1 = new DummyRule(1);
00126   r2 = new DummyRule(2);
00127   r3 = new DummyRule(3);
00128 
00129   GarpRuleSet ruleset(3);
00130 
00131   // doesn't fail until r4 is added, then it runs out of space
00132   LONGS_EQUAL(1, ruleset.add(r0));
00133   LONGS_EQUAL(2, ruleset.add(r1));
00134   LONGS_EQUAL(3, ruleset.add(r2));
00135   LONGS_EQUAL(0, ruleset.add(r3));
00136 
00137   // test if rules inserted remain in the same order
00138   // rules in ruleset is 0-based
00139   LONGS_EQUAL(0, ((DummyRule *) (ruleset.get(0)))->getId());
00140   LONGS_EQUAL(1, ((DummyRule *) (ruleset.get(1)))->getId());
00141   LONGS_EQUAL(2, ((DummyRule *) (ruleset.get(2)))->getId());
00142 }
00143 
00144 // test method trim
00145 TEST( GarpRuleSet_trim , GarpRuleSet )
00146 {
00147   DummyRule * rule;
00148   GarpRuleSet ruleset(100);
00149 
00150   testHelperAddRules(&ruleset, 0, 99);
00151 
00152   // keep first 50 rules (0-49) and delete the rest
00153   ruleset.trim(50);
00154 
00155   // check if num of rules is correct
00156   LONGS_EQUAL(50, ruleset.numRules());
00157 
00158   // now check if last rule is id 49
00159   LONGS_EQUAL(49, ((DummyRule *) (ruleset.get(49)))->getId());
00160 
00161   // check if rule 50 has been deleted
00162   rule = (DummyRule *) ruleset.get(50); CHECK(rule == NULL);
00163   rule = (DummyRule *) ruleset.get(75); CHECK(rule == NULL);
00164   rule = (DummyRule *) ruleset.get(99); CHECK(rule == NULL);
00165 }
00166 
00167 // test method clear
00168 TEST( GarpRuleSet_clear , GarpRuleSet )
00169 {
00170   DummyRule * rule;
00171   GarpRuleSet ruleset(100);
00172 
00173   testHelperAddRules(&ruleset, 0, 99);
00174 
00175   // test method clear()
00176   ruleset.clear();
00177 
00178   // check if num of rules is correct
00179   LONGS_EQUAL(0, ruleset.numRules());
00180 
00181   // check if rules have been deleted
00182   rule = (DummyRule *) ruleset.get(0); CHECK(rule == NULL);
00183   rule = (DummyRule *) ruleset.get(49); CHECK(rule == NULL);
00184   rule = (DummyRule *) ruleset.get(50); CHECK(rule == NULL);
00185   rule = (DummyRule *) ruleset.get(75); CHECK(rule == NULL);
00186   rule = (DummyRule *) ruleset.get(99); CHECK(rule == NULL);
00187 }
00188 
00189 // test method filter
00190 TEST( GarpRuleSet_filter , GarpRuleSet )
00191 {
00192   DummyRule * rule;
00193   GarpRuleSet ruleset(100);
00194 
00195   testHelperAddRules(&ruleset, 0, 99);
00196 
00197   // change some performance values. other (uninitialized) values should be 0.0
00198   rule = (DummyRule *) (ruleset.get(10)); rule->setPerformance(PerfSig, 100.0);
00199   rule = (DummyRule *) (ruleset.get(20)); rule->setPerformance(PerfSig, 100.0);
00200   rule = (DummyRule *) (ruleset.get(25)); rule->setPerformance(PerfSig, 100.0);
00201   rule = (DummyRule *) (ruleset.get(37)); rule->setPerformance(PerfSig, 100.0);
00202   rule = (DummyRule *) (ruleset.get(77)); rule->setPerformance(PerfSig, 100.0);
00203 
00204   // this one will be filtered out too
00205   rule = (DummyRule *) (ruleset.get(30)); rule->setPerformance(PerfSig, 35.0);  
00206 
00207   // filters out rules with significance lower than 50.0
00208   ruleset.filter(PerfSig, 50.0);
00209 
00210   // check how many rules were left in ruleset
00211   LONGS_EQUAL(5, ruleset.numRules());
00212 
00213   // check what rules remained
00214   // note that order of rules is important
00215   rule = (DummyRule *) (ruleset.get(0)); LONGS_EQUAL(10, rule->getId()); 
00216   rule = (DummyRule *) (ruleset.get(1)); LONGS_EQUAL(20, rule->getId()); 
00217   rule = (DummyRule *) (ruleset.get(2)); LONGS_EQUAL(25, rule->getId()); 
00218   rule = (DummyRule *) (ruleset.get(3)); LONGS_EQUAL(37, rule->getId()); 
00219   rule = (DummyRule *) (ruleset.get(4)); LONGS_EQUAL(77, rule->getId());
00220   rule = (DummyRule *) (ruleset.get(5)); CHECK(rule == NULL);
00221 }
00222 
00223 // test method replace
00224 TEST( GarpRuleSet_replace , GarpRuleSet )
00225 {
00226   DummyRule * rule;
00227   GarpRuleSet ruleset(100);
00228 
00229   testHelperAddRules(&ruleset, 0, 49);
00230 
00231   // create brand new rule 
00232   rule = new DummyRule(1250);
00233 
00234   // try to replace something that is out of bounds
00235   LONGS_EQUAL(0, ruleset.replace(-1, rule)); // rule is outside of range
00236   
00237   LONGS_EQUAL(0, ruleset.replace(75, rule));  // there is no rule at index 75
00238   // 
00239   LONGS_EQUAL(0, ruleset.replace(25, NULL));  // rule is NULL
00240 
00241   // finally replace rule correctly
00242   LONGS_EQUAL(1, ruleset.replace(25, rule));
00243 
00244   // check if it is really there
00245   rule = (DummyRule *) (ruleset.get(25)); 
00246   LONGS_EQUAL(1250, rule->getId());
00247 }
00248 
00249 // test performanceSummary method
00250 TEST ( GarpRuleSet_performanceSummary , GarpRuleSet )
00251 {
00252   double best, worst, avg;
00253   DummyRule * rule;
00254   GarpRuleSet ruleset(100);
00255 
00256   testHelperAddRules(&ruleset, 0, 99);
00257 
00258   // change some performance values. other (uninitialized) values should be 0.0
00259   rule = (DummyRule *) (ruleset.get(10)); rule->setPerformance(PerfSig, -100.0);
00260   rule = (DummyRule *) (ruleset.get(20)); rule->setPerformance(PerfSig, 50.0);
00261   rule = (DummyRule *) (ruleset.get(25)); rule->setPerformance(PerfSig, 100.0);
00262   rule = (DummyRule *) (ruleset.get(37)); rule->setPerformance(PerfSig, 50.0);
00263   rule = (DummyRule *) (ruleset.get(77)); rule->setPerformance(PerfSig, 180.0);
00264 
00265   ruleset.performanceSummary(PerfSig, &best, &worst, &avg);
00266   DOUBLES_EQUAL(2.80, avg, 0.0);
00267   DOUBLES_EQUAL(-100.0, worst, 0.0);
00268   DOUBLES_EQUAL(180.0, best, 0.0);
00269 }
00270 
00271 /*
00272 // TODO: add test for method findSimilar()
00273 TEST ( GarpRuleSet_findSimilar , GarpRuleSet )
00274 {
00275   FAIL("Test for method findSimilar() not implemented yet");
00276 }
00277 
00278 TEST ( DummyTest3 , dummy )
00279 {
00280   FAIL("At least not while you are playing around with the test framework!!");
00281 }
00282 
00283 TEST ( DummyTest2 , dummy )
00284 {
00285   FAIL("Running a set of tests and not having a failure is not cool.");
00286 }
00287 
00288 TEST ( DummyTest1 , dummy )
00289 {
00290   FAIL("This is just a test for the testing harness.");
00291 }
00292 */
00293 
00294 // ==============================================================
00295 // ====================== GarpRule hierarchy tests ==============
00296 
00297 // TODO: implement tests for all GarpRule classes