00001 //--------------------------------------------------------------------------- 00002 /** @file VCSetTest.cpp 00003 */ 00004 //--------------------------------------------------------------------------- 00005 00006 #include <boost/test/auto_unit_test.hpp> 00007 00008 #include "BitsetIterator.hpp" 00009 #include "VCBuilder.hpp" 00010 #include "VCSet.hpp" 00011 #include "ChangeLog.hpp" 00012 00013 using namespace benzene; 00014 00015 //--------------------------------------------------------------------------- 00016 00017 namespace { 00018 00019 BOOST_AUTO_TEST_CASE(VCSet_CheckCopy) 00020 { 00021 StoneBoard bd(11, 11); 00022 VCSet con1(bd.Const(), BLACK); 00023 con1.Add(VC(NORTH, SOUTH), 0); 00024 VCSet con2(con1); 00025 BOOST_CHECK(con1 == con2); 00026 00027 con1.Add(VC(NORTH, HEX_CELL_A1), 0); 00028 BOOST_CHECK(con1 != con2); 00029 00030 con2 = con1; 00031 BOOST_CHECK(con1 == con2); 00032 00033 con1.Add(VC(NORTH, HEX_CELL_C1), 0); 00034 BOOST_CHECK(con1 != con2); 00035 } 00036 00037 /** @todo Make this test quicker! */ 00038 BOOST_AUTO_TEST_CASE(VCSet_CheckRevert) 00039 { 00040 StoneBoard bd(11, 11); 00041 bd.PlayMove(BLACK, HEX_CELL_A9); 00042 bd.PlayMove(WHITE, HEX_CELL_F5); 00043 bd.PlayMove(BLACK, HEX_CELL_I4); 00044 bd.PlayMove(WHITE, HEX_CELL_H6); 00045 Groups groups; 00046 GroupBuilder::Build(bd, groups); 00047 PatternState patterns(bd); 00048 patterns.Update(); 00049 00050 ChangeLog<VC> cl; 00051 VCSet con1(bd.Const(), BLACK); 00052 con1.SetSoftLimit(VC::FULL, 10); 00053 con1.SetSoftLimit(VC::SEMI, 25); 00054 VCSet con2(con1); 00055 00056 VCBuilderParam param; 00057 param.max_ors = 4; 00058 param.and_over_edge = true; 00059 param.use_greedy_union = true; 00060 00061 VCBuilder builder(param); 00062 builder.Build(con1, groups, patterns); 00063 builder.Build(con2, groups, patterns); 00064 BOOST_CHECK(con1 == con2); 00065 00066 #if 0 00067 for (BitsetIterator p(bd.getEmpty()); p; ++p) { 00068 bitset_t added[BLACK_AND_WHITE]; 00069 added[BLACK].set(*p); 00070 bd.absorb(); 00071 bd.PlayMove(BLACK, *p); 00072 bd.absorb(*p); 00073 00074 builder.Build(con2, bd, added, &cl); 00075 00076 //std::cout << cl.dump() << std::endl; 00077 00078 con2.Revert(cl); 00079 bd.undoMove(*p); 00080 00081 BOOST_CHECK(cl.empty()); 00082 BOOST_CHECK(VCSetUtil::EqualOnGroups(con1, con2, bd)); 00083 } 00084 #endif 00085 } 00086 00087 } 00088 00089 //---------------------------------------------------------------------------