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 //---------------------------------------------------------------------------