X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibswift%2Ftests%2Fbinstest2.cpp;fp=src%2Flibswift%2Ftests%2Fbinstest2.cpp;h=d53759154743b31242d3befa9f5eb0de21f72830;hb=45963a7511531cd1656ad5d3847d2dafd015c54d;hp=0000000000000000000000000000000000000000;hpb=d069796805ad79542fd7e4406d1e9c6d2d8c2ef7;p=swifty.git diff --git a/src/libswift/tests/binstest2.cpp b/src/libswift/tests/binstest2.cpp new file mode 100755 index 0000000..d537591 --- /dev/null +++ b/src/libswift/tests/binstest2.cpp @@ -0,0 +1,544 @@ +/* + * binstest2.cpp + * serp++ + * + * Created by Victor Grishchenko on 3/22/09. + * Copyright 2009-2012 TECHNISCHE UNIVERSITEIT DELFT. All rights reserved. + * + */ +#include "binmap.h" +#include "binheap.h" + +#include +#include +#include + + +using namespace swift; + +/* +TEST(BinsTest,Routines) { + + uint32_t cell = (3<<10) | (3<<14) | (3<<0); + uint16_t correct = (1<<5) | (1<<7) | (1<<0); + uint16_t joined = binmap_t::join32to16(cell); + EXPECT_EQ(correct,joined); + + uint32_t split = binmap_t::split16to32(correct); + EXPECT_EQ(cell,split); + + EXPECT_EQ(binmap_t::NOJOIN,binmap_t::join32to16(cell|4)); + +} +*/ + + +TEST(BinsTest,SetGet) { + + binmap_t bs; + bin_t b3(1,0), b2(0,1), b4(0,2), b6(1,1), b7(2,0); + bs.set(b3); + //bs.dump("set done"); + EXPECT_TRUE(bs.is_filled(b3)); + //bs.dump("set checkd"); + EXPECT_TRUE(bs.is_filled(b2)); + //bs.dump("get b2 done"); + EXPECT_TRUE(bs.is_filled(b3)); + //bs.dump("get b3 done"); + EXPECT_TRUE(bs.is_empty(b4)); + EXPECT_TRUE(bs.is_empty(b6)); + EXPECT_FALSE(bs.is_filled(b7)); + EXPECT_FALSE(bs.is_empty(b7)); + EXPECT_TRUE(bs.is_filled(b3)); + bs.set(bin_t(1,1)); + EXPECT_TRUE(bs.is_filled(bin_t(2,0))); + +} + +/* +TEST(BinsTest,Iterator) { + binmap_t b; + b.set(bin_t(3,1)); + iterator i(&b,bin_t(0,0),false); + while (!i.solid()) + i.left(); + EXPECT_EQ(bin_t(3,0),i.bin()); + EXPECT_EQ(false,i.deep()); + EXPECT_EQ(true,i.solid()); + EXPECT_EQ(binmap_t::EMPTY,*i); + i.next(); + EXPECT_EQ(bin_t(3,1),i.bin()); + EXPECT_EQ(false,i.deep()); + EXPECT_EQ(true,i.solid()); + EXPECT_EQ(binmap_t::FILLED,*i); + i.next(); + EXPECT_TRUE(i.end()); +} +*/ + +TEST(BinsTest,Chess) { + binmap_t chess16; + for(int i=0; i<16; i++) { + if (i&1) { + chess16.set(bin_t(0,i)); + } else { + chess16.reset(bin_t(0,i)); + } + } + + for(int i=0; i<16; i++) { + if (i&1) { + EXPECT_TRUE(chess16.is_filled(bin_t(0,i))); + } else { + EXPECT_TRUE(chess16.is_empty(bin_t(0,i))); + } + } + EXPECT_FALSE(chess16.is_empty(bin_t(4,0))); + for(int i=0; i<16; i+=2) + chess16.set(bin_t(0,i)); + EXPECT_TRUE(chess16.is_filled(bin_t(4,0))); + EXPECT_TRUE(chess16.is_filled(bin_t(2,3))); + + chess16.set(bin_t(4,1)); + EXPECT_TRUE(chess16.is_filled(bin_t(5,0))); +} + +TEST(BinsTest,Staircase) { + + const int TOPLAYR = 44; + binmap_t staircase; + for(int i=0;i(1<<3)) + tw = tw.left(); + tw = tw.twisted(1<<3); + EXPECT_EQ(bin_t(3,2),tw); + b.twist(0); + EXPECT_TRUE(b.is_filled(bin_t(3,2))); + EXPECT_TRUE(b.is_empty(bin_t(3,3))); +} +*/ + +TEST(BinsTest,SeqLength) { + binmap_t b; + b.set(bin_t(3,0)); + b.set(bin_t(1,4)); + b.set(bin_t(0,10)); + b.set(bin_t(3,2)); + EXPECT_EQ(11,b.find_empty().base_offset()); +} + +TEST(BinsTest,EmptyFilled) { + // 1112 3312 2111 .... + binmap_t b; + + EXPECT_TRUE(b.is_empty(bin_t::ALL)); + + b.set(bin_t(1,0)); + b.set(bin_t(0,2)); + b.set(bin_t(0,6)); + b.set(bin_t(1,5)); + b.set(bin_t(0,9)); + + EXPECT_FALSE(b.is_empty(bin_t::ALL)); + + EXPECT_TRUE(b.is_empty(bin_t(2,3))); + EXPECT_FALSE(b.is_filled(bin_t(2,3))); + //EXPECT_TRUE(b.is_solid(bin_t(2,3),binmap_t::MIXED)); + EXPECT_TRUE(b.is_filled(bin_t(1,0))); + EXPECT_TRUE(b.is_filled(bin_t(1,5))); + EXPECT_FALSE(b.is_filled(bin_t(1,3))); + + b.set(bin_t(0,3)); + b.set(bin_t(0,7)); + b.set(bin_t(0,8)); + + EXPECT_TRUE(b.is_filled(bin_t(2,0))); + EXPECT_TRUE(b.is_filled(bin_t(2,2))); + EXPECT_FALSE(b.is_filled(bin_t(2,1))); + + b.set(bin_t(1,2)); + EXPECT_TRUE(b.is_filled(bin_t(2,1))); +} + +TEST(BinheapTest,Eat) { + + binheap b; + b.push(bin_t(0,1)); + b.push(bin_t(0,3)); + b.push(bin_t(2,0)); + b.push(bin_t(2,4)); + + EXPECT_EQ(bin_t(2,0),b.pop()); + EXPECT_EQ(bin_t(2,4),b.pop()); + EXPECT_EQ(bin_t::NONE,b.pop()); + + for (int i=0; i<64; i++) { + b.push(bin_t(0,i)); + } + b.push(bin_t(5,0)); + EXPECT_EQ(bin_t(5,0),b.pop()); + for (int i=32; i<64; i++) + EXPECT_EQ(bin_t(0,i),b.pop()); +} + +/*TEST(BinsTest,RangeOpTest) { + binmap_t a, b; + a.set(bin_t(0,0)); + a.set(bin_t(0,2)); + b.set(bin_t(0,1)); + b.set(bin_t(0,3)); + a.range_or(b,bin_t(1,0)); + EXPECT_TRUE(a.is_filled(bin_t(1,0))); + EXPECT_FALSE(a.is_filled(bin_t(1,1))); + + binmap_t f, s; + f.set(bin_t(3,0)); + s.set(bin_t(0,1)); + s.set(bin_t(0,4)); + f.range_remove(s,bin_t(2,1)); + + EXPECT_TRUE(f.is_filled(bin_t(2,0))); + EXPECT_FALSE(f.is_filled(bin_t(0,4))); + EXPECT_TRUE(f.is_filled(bin_t(0,5))); + + binmap_t z, x; + z.set(bin_t(1,0)); + z.set(bin_t(1,2)); + x.set(bin_t(0,1)); + x.set(bin_t(0,1)); +} +*/ + +/* +TEST(BinsTest,CoarseBitmap) { + binmap_t b; + b.set(bin_t(4,0)); + union {uint16_t i16[2]; uint32_t i32;}; + b.to_coarse_bitmap(i16,bin_t(5,0),0); + EXPECT_EQ((1<<16)-1,i32); + + b.set(bin_t(14,0)); + i32=0; + b.to_coarse_bitmap(i16,bin_t(15,0),10); + EXPECT_EQ((1<<16)-1,i32); + + binmap_t rough; + rough.set(bin_t(1,0)); + rough.set(bin_t(0,2)); + i32=0; + rough.to_coarse_bitmap(i16,bin_t(6,0),1); + EXPECT_EQ(1,i32); + + binmap_t ladder; + ladder.set(bin_t(6,2)); + ladder.set(bin_t(5,2)); + ladder.set(bin_t(4,2)); + ladder.set(bin_t(3,2)); + ladder.set(bin_t(2,2)); + ladder.set(bin_t(1,2)); + ladder.set(bin_t(0,2)); + i32=0; + ladder.to_coarse_bitmap(i16,bin_t(8,0),3); + EXPECT_EQ(0x00ff0f34,i32); + + binmap_t bin; + bin.set(bin_t(3,0)); + bin.set(bin_t(0,8)); + i32 = 0; + bin.to_coarse_bitmap(i16,bin_t(4,0),0); + EXPECT_EQ((1<<9)-1,i32); + + i32 = 0; + bin.to_coarse_bitmap(i16,bin_t(7,0),3); + EXPECT_EQ(1,i32); + + i32 = 0; + bin.to_coarse_bitmap(i16,bin_t(4,0),3); + EXPECT_EQ(1,i32); + + i32 = 0; + bin.to_coarse_bitmap(i16,bin_t(2,0),1); + EXPECT_EQ(3,i32&3); + + uint64_t bigint; + bigint = 0; + binmap_t bm; + bm.set(bin_t(6,0)); + bm.to_coarse_bitmap((uint16_t*)&bigint,bin_t(6,0),0); + EXPECT_EQ( 0xffffffffffffffffULL, bigint ); + +} +*/ + +/*TEST(BinsTest,AddSub) { + binmap_t b; + b|=15; + b-=1; + ASSERT_TRUE(b.contains(2)); + ASSERT_TRUE(b.contains(14)); + ASSERT_FALSE(b.contains(3)); + ASSERT_FALSE(b.contains(22)); + ASSERT_TRUE(b.contains(12)); + b-=13; + ASSERT_FALSE(b.contains(12)); + ASSERT_FALSE(b.contains(14)); + ASSERT_FALSE(b.contains(11)); + ASSERT_TRUE(b.contains(10)); +} + + +TEST(BinsTest,Peaks) { + bin::vec peaks = bin::peaks(11); + ASSERT_EQ(3,peaks.size()); + ASSERT_EQ(15,peaks[0]); + ASSERT_EQ(18,peaks[1]); + ASSERT_EQ(19,peaks[2]); +} + +TEST(BinsTest,Performance) { + binmap_t b; + std::set s; + clock_t start, end; + double b_time, s_time; + int b_size, s_size; + + start = clock(); + for(int i=1; i<(1<<20); i++) + b |= bin(i); + //b_size = b.bits.size(); + end = clock(); + b_time = ((double) (end - start)) / CLOCKS_PER_SEC; + //ASSERT_EQ(1,b.bits.size()); + + start = clock(); + for(int i=1; i<(1<<20); i++) + s.insert(i); + s_size = s.size(); + end = clock(); + s_time = ((double) (end - start)) / CLOCKS_PER_SEC; + + printf("bins: %f (%i), set: %f (%i)\n",b_time,b_size,s_time,s_size); +}*/ + +int main (int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}