// $Id$ // // Copyright (c) 2003-2006 Greg Landrum and Rational Discovery LLC // // @@ All Rights Reserved @@ // This file is part of the RDKit. // The contents are covered by the terms of the BSD license // which is included in the file license.txt, found at the root // of the RDKit source tree. // #include "QueryObjects.h" #include #include #include using namespace std; using namespace Queries; void test1() { cout << "Float" << endl; EqualityQuery q(1.0); CHECK_INVARIANT(!q.Match(0.0), ""); CHECK_INVARIANT(q.Match(1.0), ""); CHECK_INVARIANT(!q.Match(1.001), ""); CHECK_INVARIANT(!q.Match(1.1), ""); CHECK_INVARIANT(!q.Match(-2), ""); cout << "With Tolerance" << endl; q.setTol(0.002); CHECK_INVARIANT(!q.Match(0.0), ""); CHECK_INVARIANT(q.Match(1.0), ""); CHECK_INVARIANT(q.Match(1.001), ""); CHECK_INVARIANT(!q.Match(1.1), ""); CHECK_INVARIANT(!q.Match(-2), ""); Query *newQ; newQ = q.copy(); CHECK_INVARIANT(!newQ->Match(0.0), ""); CHECK_INVARIANT(newQ->Match(1.0), ""); CHECK_INVARIANT(newQ->Match(1.001), ""); CHECK_INVARIANT(!newQ->Match(1.1), ""); CHECK_INVARIANT(!newQ->Match(-2), ""); } void test2() { cout << "Set" << endl; SetQuery q; q.insert(1); q.insert(3); q.insert(5); CHECK_INVARIANT(!q.Match(0), ""); CHECK_INVARIANT(q.Match(1), ""); CHECK_INVARIANT(q.Match(3), ""); CHECK_INVARIANT(!q.Match(-3), ""); Query *newQ; newQ = q.copy(); CHECK_INVARIANT(!newQ->Match(0), ""); CHECK_INVARIANT(newQ->Match(1), ""); CHECK_INVARIANT(newQ->Match(3), ""); CHECK_INVARIANT(!newQ->Match(-3), ""); } void test3() { cout << "And" << endl; AndQuery *q = new AndQuery; LessQuery *l = new LessQuery; l->setVal(0); GreaterEqualQuery *g = new GreaterEqualQuery; g->setVal(3); q->addChild(Query::CHILD_TYPE(l)); q->addChild(Query::CHILD_TYPE(g)); CHECK_INVARIANT(!q->Match(0), ""); CHECK_INVARIANT(q->Match(1), ""); CHECK_INVARIANT(q->Match(3), ""); CHECK_INVARIANT(!q->Match(-3), ""); Query *newQ; newQ = q->copy(); CHECK_INVARIANT(!newQ->Match(0), ""); CHECK_INVARIANT(newQ->Match(1), ""); CHECK_INVARIANT(newQ->Match(3), ""); CHECK_INVARIANT(!newQ->Match(-3), ""); } void test4() { cout << "Or" << endl; OrQuery *q = new OrQuery; LessQuery *l = new LessQuery; l->setVal(0); GreaterEqualQuery *g = new GreaterEqualQuery; g->setVal(3); q->addChild(Query::CHILD_TYPE(l)); q->addChild(Query::CHILD_TYPE(g)); CHECK_INVARIANT(q->Match(0), ""); CHECK_INVARIANT(q->Match(1), ""); CHECK_INVARIANT(q->Match(3), ""); CHECK_INVARIANT(q->Match(-3), ""); Query *newQ; newQ = q->copy(); CHECK_INVARIANT(newQ->Match(0), ""); CHECK_INVARIANT(newQ->Match(1), ""); CHECK_INVARIANT(newQ->Match(3), ""); CHECK_INVARIANT(newQ->Match(-3), ""); } void test5() { cout << "XOr" << endl; XOrQuery *q = new XOrQuery; LessQuery *l = new LessQuery; l->setVal(0); GreaterEqualQuery *g = new GreaterEqualQuery; g->setVal(3); q->addChild(Query::CHILD_TYPE(l)); q->addChild(Query::CHILD_TYPE(g)); CHECK_INVARIANT(q->Match(-1), ""); CHECK_INVARIANT(q->Match(0), ""); CHECK_INVARIANT(!q->Match(1), ""); CHECK_INVARIANT(!q->Match(3), ""); CHECK_INVARIANT(q->Match(-3), ""); Query *newQ; newQ = q->copy(); CHECK_INVARIANT(newQ->Match(-1), ""); CHECK_INVARIANT(newQ->Match(0), ""); CHECK_INVARIANT(!newQ->Match(1), ""); CHECK_INVARIANT(!newQ->Match(3), ""); CHECK_INVARIANT(newQ->Match(-3), ""); } int foofun(double bar) { return int(floor(bar)); }; void test6() { cout << "pointer and copy foo" << endl; EqualityQuery q; q.setDataFunc(foofun); q.setVal(6); CHECK_INVARIANT(q.Match(6.0), ""); CHECK_INVARIANT(q.Match(6.1), ""); CHECK_INVARIANT(!q.Match(5.0), ""); Query *newQ; newQ = q.copy(); CHECK_INVARIANT(newQ->Match(6.0), ""); CHECK_INVARIANT(newQ->Match(6.1), ""); CHECK_INVARIANT(!newQ->Match(5.0), ""); Query *newQ2 = &q; CHECK_INVARIANT(newQ2->Match(6.0), ""); CHECK_INVARIANT(newQ2->Match(6.1), ""); CHECK_INVARIANT(!newQ2->Match(5.0), ""); Query *newQ3; newQ3 = newQ2->copy(); CHECK_INVARIANT(newQ3->Match(6.0), ""); CHECK_INVARIANT(newQ3->Match(6.1), ""); CHECK_INVARIANT(!newQ3->Match(5.0), ""); } bool matchF(int v) { return v == 3; } int dataF(float v) { return int(floor(v)) * 3; } bool cmp(int v) { return v < 3; } void basics1() { cout << "Query" << endl; Query q; q.setMatchFunc(matchF); q.setDataFunc(dataF); CHECK_INVARIANT(!q.Match(0.0), ""); CHECK_INVARIANT(q.Match(1.0), ""); CHECK_INVARIANT(q.Match(1.1), ""); CHECK_INVARIANT(!q.Match(-2.0), ""); TEST_ASSERT(!q.getMatchFunc()(0)); TEST_ASSERT(q.getMatchFunc()(3)); TEST_ASSERT(q.getDataFunc()(1.0) == dataF(1.0)); cout << "Query2" << endl; Query q2; q2.setDataFunc(cmp); CHECK_INVARIANT(q2.Match(0), ""); CHECK_INVARIANT(q2.Match(1), ""); CHECK_INVARIANT(!q2.Match(3), ""); CHECK_INVARIANT(!q2.Match(4), ""); CHECK_INVARIANT(!q2.Match(4.0), ""); } void basics2() { cout << "Equality" << endl; EqualityQuery q2; q2.setVal(3); CHECK_INVARIANT(!q2.Match(0), ""); CHECK_INVARIANT(!q2.Match(1), ""); CHECK_INVARIANT(q2.Match(3), ""); CHECK_INVARIANT(!q2.Match(-3), ""); cout << "Greater" << endl; GreaterQuery q3; q3.setVal(3); CHECK_INVARIANT(q3.Match(0), ""); CHECK_INVARIANT(q3.Match(1), ""); CHECK_INVARIANT(!q3.Match(3), ""); CHECK_INVARIANT(!q3.Match(5), ""); cout << "GreaterEqual" << endl; GreaterEqualQuery q4(3); CHECK_INVARIANT(q4.Match(0), ""); CHECK_INVARIANT(q4.Match(1), ""); CHECK_INVARIANT(q4.Match(3), ""); CHECK_INVARIANT(!q4.Match(5), ""); cout << "Less" << endl; LessQuery q5; q5.setVal(3); CHECK_INVARIANT(!q5.Match(0), ""); CHECK_INVARIANT(!q5.Match(1), ""); CHECK_INVARIANT(!q5.Match(3), ""); CHECK_INVARIANT(q5.Match(5), ""); cout << "LessEqual" << endl; LessEqualQuery q6(3); CHECK_INVARIANT(!q6.Match(0), ""); CHECK_INVARIANT(!q6.Match(1), ""); CHECK_INVARIANT(q6.Match(3), ""); CHECK_INVARIANT(q6.Match(5), ""); cout << "Open Range" << endl; RangeQuery q7(0, 3); CHECK_INVARIANT(!q7.Match(0), ""); CHECK_INVARIANT(q7.Match(1), ""); CHECK_INVARIANT(!q7.Match(3), ""); CHECK_INVARIANT(!q7.Match(5), ""); cout << "Closed Range" << endl; q7.setEndsOpen(false, false); CHECK_INVARIANT(q7.Match(0), ""); CHECK_INVARIANT(q7.Match(1), ""); CHECK_INVARIANT(q7.Match(3), ""); CHECK_INVARIANT(!q7.Match(5), ""); } int convFunc(const char *arg) { return boost::lexical_cast(arg); }; void test7() { cout << "Set2" << endl; SetQuery q; q.setDataFunc(convFunc); q.insert(1); q.insert(3); q.insert(5); CHECK_INVARIANT(!q.Match("0"), ""); CHECK_INVARIANT(q.Match("1"), ""); CHECK_INVARIANT(q.Match("3"), ""); CHECK_INVARIANT(!q.Match("-3"), ""); Query *newQ; newQ = q.copy(); CHECK_INVARIANT(!newQ->Match("0"), ""); CHECK_INVARIANT(newQ->Match("1"), ""); CHECK_INVARIANT(newQ->Match("3"), ""); CHECK_INVARIANT(!newQ->Match("-3"), ""); } int main() { basics1(); basics2(); test1(); test2(); test3(); test4(); test5(); test6(); test7(); return 0; }