Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

VCListTest.cpp

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------
00002 /** @file
00003 
00004     @todo Write tests for the following methods:
00005 
00006           isVCSuperSetOfAny(), removeSuperSetsOf(), add(VCList other), 
00007           simple_add(), find(), getGreedyUnion(), operator==(), 
00008           operator!=(). 
00009 
00010           Maybe do some more thorough testing of the softlimit
00011           stuff. But this is pretty good already, I think.
00012 */
00013 //---------------------------------------------------------------------------
00014 #include <boost/test/auto_unit_test.hpp>
00015 
00016 #include "VCList.hpp"
00017 #include "ChangeLog.hpp"
00018 
00019 using namespace benzene;
00020 
00021 //---------------------------------------------------------------------------
00022 
00023 namespace {
00024 
00025 BOOST_AUTO_TEST_CASE(VCList_Basic)
00026 {
00027     HexPoint x = HEX_CELL_A1;
00028     HexPoint y = HEX_CELL_A2;
00029 
00030     VCList vl(x, y, 2);
00031 
00032     // starts out empty
00033     BOOST_CHECK(vl.empty());
00034     BOOST_CHECK_EQUAL(vl.size(), 0);
00035 
00036     // any add should succeed here
00037     bitset_t b1;
00038     b1.set(FIRST_CELL);
00039     VC v1(x, y, b1, VC_RULE_BASE);
00040     BOOST_CHECK_EQUAL(vl.add(v1, NULL), VCList::ADDED_INSIDE_SOFT_LIMIT);
00041     BOOST_CHECK(!vl.empty());
00042     BOOST_CHECK_EQUAL(vl.size(), 1);
00043 
00044     BOOST_CHECK_EQUAL(vl.hardIntersection(), v1.carrier());
00045     BOOST_CHECK_EQUAL(vl.getUnion(), v1.carrier());
00046 
00047     // duplicates are not added
00048     BOOST_CHECK_EQUAL(vl.add(v1, NULL), VCList::ADD_FAILED);
00049     BOOST_CHECK(!vl.empty());
00050     BOOST_CHECK_EQUAL(vl.size(), 1);
00051 
00052     // try adding a superset; should fail
00053     bitset_t b2;
00054     b2.set(FIRST_CELL);
00055     b2.set(FIRST_CELL+1);
00056     VC v2(x, y, b2, VC_RULE_BASE);
00057     BOOST_CHECK_EQUAL(vl.add(v2, NULL), VCList::ADD_FAILED);
00058     BOOST_CHECK(!vl.empty());
00059     BOOST_CHECK_EQUAL(vl.size(), 1);
00060 
00061     // add a non-superset with three set bits
00062     bitset_t b3;
00063     b3.set(FIRST_CELL+1);
00064     b3.set(FIRST_CELL+2);
00065     b3.set(FIRST_CELL+3);
00066     VC v3(x, y, b3, VC_RULE_BASE);
00067     BOOST_CHECK_EQUAL(vl.add(v3, NULL), VCList::ADDED_INSIDE_SOFT_LIMIT);
00068     BOOST_CHECK(!vl.empty());
00069     BOOST_CHECK_EQUAL(vl.size(), 2);
00070 
00071     // ensure v1 appears before v3
00072     VCList::const_iterator it = vl.begin();
00073     BOOST_CHECK_EQUAL(*it, v1);
00074     ++it;
00075     BOOST_CHECK_EQUAL(*it, v3);
00076     ++it;
00077     BOOST_CHECK(it == vl.end());
00078 
00079     BOOST_CHECK_EQUAL(vl.hardIntersection(), v1.carrier() & v3.carrier());
00080     BOOST_CHECK_EQUAL(vl.getUnion(), v1.carrier() | v3.carrier());
00081 
00082     // add a subset of v3: add should succeed and v3 should be
00083     // removed.
00084     bitset_t b4;
00085     b4.set(FIRST_CELL+1);
00086     b4.set(FIRST_CELL+2);
00087     VC v4(x, y, b4, VC_RULE_BASE);
00088     BOOST_CHECK_EQUAL(vl.add(v4, NULL), VCList::ADDED_INSIDE_SOFT_LIMIT);
00089     BOOST_CHECK(!vl.empty());
00090     BOOST_CHECK_EQUAL(vl.size(), 2);
00091 
00092     // list should be [v1, v4].
00093     it = vl.begin();
00094     BOOST_CHECK_EQUAL(*it, v1);
00095     ++it;
00096     BOOST_CHECK_EQUAL(*it, v4);
00097     ++it;
00098     BOOST_CHECK(it == vl.end());
00099 
00100     BOOST_CHECK_EQUAL(vl.hardIntersection(), v1.carrier() & v4.carrier());
00101     BOOST_CHECK_EQUAL(vl.getUnion(), v1.carrier() | v4.carrier());
00102 
00103     // add another vc to the list; this one is added past the
00104     // end of the softlimit.
00105     bitset_t b5;
00106     b5.set(FIRST_CELL+1);
00107     b5.set(FIRST_CELL+3);
00108     b5.set(FIRST_CELL+5);
00109     VC v5(x, y, b5, VC_RULE_BASE);
00110     BOOST_CHECK_EQUAL(vl.add(v5, NULL), VCList::ADDED_INSIDE_HARD_LIMIT);
00111     BOOST_CHECK(!vl.empty());
00112     BOOST_CHECK_EQUAL(vl.size(), 3);
00113 
00114     // list should be [v1, v4, v5].
00115     it = vl.begin();
00116     BOOST_CHECK_EQUAL(*it, v1);
00117     ++it;
00118     BOOST_CHECK_EQUAL(*it, v4);
00119     ++it;
00120     BOOST_CHECK_EQUAL(*it, v5);
00121     ++it;
00122     BOOST_CHECK(it == vl.end());
00123     
00124     BOOST_CHECK_EQUAL(vl.softIntersection(), v1.carrier() & v4.carrier());
00125     BOOST_CHECK_EQUAL(vl.hardIntersection(), 
00126                       v1.carrier() & v4.carrier() & v5.carrier());
00127     BOOST_CHECK_EQUAL(vl.getUnion(), v1.carrier()|v4.carrier()|v5.carrier());
00128     
00129     // test removingAllContaining()
00130     bitset_t remove;
00131     remove.set(FIRST_CELL+2);
00132     remove.set(FIRST_EDGE);
00133     std::list<VC> removed;
00134     BOOST_CHECK_EQUAL(vl.removeAllContaining(remove, removed, NULL), 1);
00135     BOOST_CHECK_EQUAL(*removed.begin(), v4);
00136     BOOST_CHECK_EQUAL(vl.size(), 2);
00137 
00138     // list should be [v1, v5].
00139     it = vl.begin();
00140     BOOST_CHECK_EQUAL(*it, v1);
00141     ++it;
00142     BOOST_CHECK_EQUAL(*it, v5);
00143     ++it;
00144     BOOST_CHECK(it == vl.end());
00145 
00146     BOOST_CHECK_EQUAL(vl.hardIntersection(), v1.carrier() & v5.carrier());
00147     BOOST_CHECK_EQUAL(vl.getUnion(), v1.carrier() | v5.carrier());
00148 
00149     // test remove(VC)
00150     BOOST_CHECK(!vl.remove(v4, NULL));
00151     BOOST_CHECK(vl.remove(v1, NULL));
00152     BOOST_CHECK_EQUAL(vl.size(), 1);
00153     
00154     // list should be [v5]
00155     it = vl.begin();
00156     BOOST_CHECK_EQUAL(*it, v5);
00157     ++it;
00158     BOOST_CHECK(it == vl.end());
00159 
00160     BOOST_CHECK_EQUAL(vl.hardIntersection(), v5.carrier());
00161     BOOST_CHECK_EQUAL(vl.getUnion(), v5.carrier());
00162 }
00163 
00164 }
00165 
00166 //---------------------------------------------------------------------------


6 Jan 2011 Doxygen 1.6.3