openModeller
Version 1.4.0
|
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