5 * Created by Victor Grishchenko on 3/22/09.
6 * Copyright 2009 Delft University of Technology. All rights reserved.
11 #include <gtest/gtest.h>
15 TEST(BinsTest,Routines) {
17 uint32_t cell = (3<<10) | (3<<14) | (3<<0);
18 uint16_t correct = (1<<5) | (1<<7) | (1<<0);
19 uint16_t joined = binmap_t::join32to16(cell);
20 EXPECT_EQ(correct,joined);
22 uint32_t split = binmap_t::split16to32(correct);
23 EXPECT_EQ(cell,split);
25 EXPECT_EQ(binmap_t::NOJOIN,binmap_t::join32to16(cell|4));
29 TEST(BinsTest,SetGet) {
32 bin64_t b3(1,0), b2(0,1), b4(0,2), b6(1,1), b7(2,0);
34 //bs.dump("set done");
35 EXPECT_EQ(binmap_t::FILLED,bs.get(b3));
36 //bs.dump("set checkd");
37 EXPECT_EQ(binmap_t::FILLED,bs.get(b2));
38 //bs.dump("get b2 done");
39 EXPECT_EQ(binmap_t::FILLED,bs.get(b3));
40 //bs.dump("get b3 done");
41 EXPECT_EQ(binmap_t::EMPTY,bs.get(b4));
42 EXPECT_EQ(binmap_t::EMPTY,bs.get(b6));
43 EXPECT_NE(binmap_t::FILLED,bs.get(b7));
44 EXPECT_NE(binmap_t::EMPTY,bs.get(b7));
45 EXPECT_EQ(binmap_t::FILLED,bs.get(b3));
47 EXPECT_EQ(binmap_t::FILLED,bs.get(bin64_t(2,0)));
51 TEST(BinsTest,Iterator) {
54 iterator i(&b,bin64_t(0,0),false);
57 EXPECT_EQ(bin64_t(3,0),i.bin());
58 EXPECT_EQ(false,i.deep());
59 EXPECT_EQ(true,i.solid());
60 EXPECT_EQ(binmap_t::EMPTY,*i);
62 EXPECT_EQ(bin64_t(3,1),i.bin());
63 EXPECT_EQ(false,i.deep());
64 EXPECT_EQ(true,i.solid());
65 EXPECT_EQ(binmap_t::FILLED,*i);
70 TEST(BinsTest,Chess) {
72 for(int i=0; i<15; i++)
73 chess16.set(bin64_t(0,i), (i&1)?binmap_t::FILLED:binmap_t::EMPTY);
74 chess16.set(bin64_t(0,15), binmap_t::FILLED);
75 for(int i=0; i<16; i++)
76 EXPECT_EQ((i&1)?binmap_t::FILLED:binmap_t::EMPTY, chess16.get(bin64_t(0,i)));
77 EXPECT_NE(binmap_t::FILLED,chess16.get(bin64_t(4,0)));
78 EXPECT_NE(binmap_t::EMPTY,chess16.get(bin64_t(4,0)));
79 for(int i=0; i<16; i+=2)
80 chess16.set(bin64_t(0,i), binmap_t::FILLED);
81 EXPECT_EQ(binmap_t::FILLED,chess16.get(bin64_t(4,0)));
82 EXPECT_EQ(binmap_t::FILLED,chess16.get(bin64_t(2,3)));
84 chess16.set(bin64_t(4,1),binmap_t::FILLED);
85 EXPECT_EQ(binmap_t::FILLED,chess16.get(bin64_t(5,0)));
88 TEST(BinsTest,Staircase) {
90 const int TOPLAYR = 44;
92 for(int i=0;i<TOPLAYR;i++)
93 staircase.set(bin64_t(i,1),binmap_t::FILLED);
95 EXPECT_NE(binmap_t::FILLED,staircase.get(bin64_t(TOPLAYR,0)));
96 EXPECT_NE(binmap_t::EMPTY,staircase.get(bin64_t(TOPLAYR,0)));
98 staircase.set(bin64_t(0,0),binmap_t::FILLED);
99 EXPECT_EQ(binmap_t::FILLED,staircase.get(bin64_t(TOPLAYR,0)));
103 TEST(BinsTest,Hole) {
106 hole.set(bin64_t(8,0),binmap_t::FILLED);
107 hole.set(bin64_t(6,1),binmap_t::EMPTY);
108 hole.set(bin64_t(6,2),binmap_t::EMPTY);
109 EXPECT_EQ(binmap_t::FILLED,hole.get(bin64_t(6,0)));
110 EXPECT_EQ(binmap_t::FILLED,hole.get(bin64_t(6,3)));
111 EXPECT_NE(binmap_t::FILLED,hole.get(bin64_t(8,0)));
112 EXPECT_NE(binmap_t::EMPTY,hole.get(bin64_t(8,0)));
113 EXPECT_EQ(binmap_t::EMPTY,hole.get(bin64_t(6,1)));
120 hole.set(bin64_t(4,0),binmap_t::FILLED);
121 hole.set(bin64_t(1,1),binmap_t::EMPTY);
122 hole.set(bin64_t(0,7),binmap_t::EMPTY);
123 bin64_t f = hole.find(bin64_t(4,0)).left_foot();
124 EXPECT_EQ(bin64_t(0,2),f);
128 TEST(BinsTest,Stripes) {
131 zebra.set(bin64_t(5,0));
132 zebra.set(bin64_t(3,1),binmap_t::EMPTY);
133 zebra.set(bin64_t(1,12),binmap_t::EMPTY);
134 zebra.set(bin64_t(1,14),binmap_t::EMPTY);
136 uint64_t *stripes = zebra.get_stripes(count);
138 EXPECT_EQ(0,stripes[0]);
139 EXPECT_EQ(0,stripes[1]);
140 EXPECT_EQ(8,stripes[2]);
141 EXPECT_EQ(16,stripes[3]);
142 EXPECT_EQ(24,stripes[4]);
143 EXPECT_EQ(26,stripes[5]);
144 EXPECT_EQ(28,stripes[6]);
145 EXPECT_EQ(30,stripes[7]);
146 EXPECT_EQ(32,stripes[8]);
151 TEST(BinsTest,StripesAgg) {
154 zebra.set(bin64_t(0,1));
155 zebra.set(bin64_t(0,2));
157 uint64_t *stripes = zebra.get_stripes(count);
159 EXPECT_EQ(0,stripes[0]);
160 EXPECT_EQ(1,stripes[1]);
161 EXPECT_EQ(3,stripes[2]);
166 TEST(BinsTest,Alloc) {
171 b.set(bin64_t(1,0),binmap_t::EMPTY);
172 b.set(bin64_t(1,1),binmap_t::EMPTY);
173 EXPECT_EQ(1,b.size());
177 TEST(BinsTest,Remove) {
185 EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(2,0)));
186 EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(2,1)));
187 EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(2,2)));
188 EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(2,3)));
189 EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(4,1)));
191 binmap_t b16, b1024, b8192;
192 b16.set(bin64_t(3,1));
193 b1024.set(bin64_t(3,1));
194 b1024.set(bin64_t(4,2));
195 b1024.set(bin64_t(8,3));
196 b8192.set(bin64_t(8,3));
197 b8192.set(bin64_t(10,7));
202 EXPECT_EQ(binmap_t::EMPTY,b1024.get(bin64_t(3,1)));
203 EXPECT_EQ(binmap_t::EMPTY,b1024.get(bin64_t(5,0)));
204 EXPECT_EQ(binmap_t::EMPTY,b1024.get(bin64_t(9,1)));
205 EXPECT_EQ(binmap_t::EMPTY,b1024.get(bin64_t(12,1)));
206 EXPECT_EQ(binmap_t::FILLED,b1024.get(bin64_t(4,2)));
208 b8192.set(bin64_t(2,3));
210 EXPECT_EQ(binmap_t::EMPTY,b16.get(bin64_t(2,3)));
211 EXPECT_EQ(binmap_t::FILLED,b16.get(bin64_t(2,2)));
215 TEST(BinsTest,FindFiltered) {
217 binmap_t data, filter;
218 data.set(bin64_t(2,0));
219 data.set(bin64_t(2,2));
220 data.set(bin64_t(1,7));
221 filter.set(bin64_t(2,1));
222 filter.set(bin64_t(1,4));
223 filter.set(bin64_t(0,13));
225 bin64_t x = data.find_filtered(filter,bin64_t(4,0)).left_foot();
226 EXPECT_EQ(bin64_t(0,12),x);
231 TEST(BinsTest, Cover) {
236 EXPECT_EQ(bin64_t(4,1),b.cover(bin64_t(0,30)));
237 EXPECT_EQ(bin64_t(2,0),b.cover(bin64_t(0,3)));
238 EXPECT_EQ(bin64_t(2,0),b.cover(bin64_t(2,0)));
240 //EXPECT_EQ(bin64_t::ALL,b.cover(bin64_t(0,30)));
245 TEST(BinsTest,FindFiltered2) {
247 binmap_t data, filter;
248 for(int i=0; i<1024; i+=2)
249 data.set(bin64_t(0,i));
250 for(int j=1; j<1024; j+=2)
251 filter.set(bin64_t(0,j));
252 filter.set(bin64_t(0,501),binmap_t::EMPTY);
253 EXPECT_EQ(bin64_t(0,501),data.find_filtered(filter,bin64_t(10,0)).left_foot());
254 data.set(bin64_t(0,501));
255 EXPECT_EQ(bin64_t::NONE,data.find_filtered(filter,bin64_t(10,0)).left_foot());
259 TEST(BinsTest,CopyRange) {
261 data.set(bin64_t(2,0));
262 data.set(bin64_t(2,2));
263 data.set(bin64_t(1,7));
264 add.set(bin64_t(2,1));
265 add.set(bin64_t(1,4));
266 add.set(bin64_t(0,13));
267 add.set(bin64_t(5,118));
268 data.range_copy(add, bin64_t(3,0));
269 EXPECT_TRUE(binmap_t::is_mixed(data.get(bin64_t(3,0))));
270 EXPECT_EQ(binmap_t::EMPTY,data.get(bin64_t(2,0)));
271 EXPECT_EQ(binmap_t::FILLED,data.get(bin64_t(2,1)));
272 EXPECT_EQ(binmap_t::EMPTY,data.get(bin64_t(1,6)));
273 EXPECT_EQ(binmap_t::FILLED,data.get(bin64_t(1,7)));
276 TEST(BinsTest, Mass) {
278 b.set(bin64_t(6,0),binmap_t::FILLED);
279 b.set(bin64_t(0,0),binmap_t::EMPTY);
280 EXPECT_EQ(63,b.mass());
281 EXPECT_FALSE(b.is_empty());
283 EXPECT_TRUE(b.is_empty());
284 EXPECT_EQ(0,b.mass());
287 for(int i=0; i<50; i++)
288 b50.set(bin64_t(4,i*2));
289 EXPECT_EQ(50<<4,b50.mass());
292 TEST(BinsTest,Twist) {
295 EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(3,2)));
296 EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(3,3)));
298 EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(3,3)));
299 EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(3,2)));
300 bin64_t tw = b.find(bin64_t(5,0),binmap_t::FILLED);
301 while (tw.width()>(1<<3))
303 tw = tw.twisted(1<<3);
304 EXPECT_EQ(bin64_t(3,2),tw);
306 EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(3,2)));
307 EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(3,3)));
310 TEST(BinsTest,SeqLength) {
314 b.set(bin64_t(0,10));
316 EXPECT_EQ(11,b.seq_length());
319 TEST(BinsTest,EmptyFilled) {
320 // 1112 3312 2111 ....
323 EXPECT_TRUE(b.is_empty(bin64_t::ALL));
331 EXPECT_FALSE(b.is_empty(bin64_t::ALL));
333 EXPECT_TRUE(b.is_empty(bin64_t(2,3)));
334 EXPECT_FALSE(b.is_filled(bin64_t(2,3)));
335 EXPECT_TRUE(b.is_solid(bin64_t(2,3),binmap_t::MIXED));
336 EXPECT_TRUE(b.is_filled(bin64_t(1,0)));
337 EXPECT_TRUE(b.is_filled(bin64_t(1,5)));
338 EXPECT_FALSE(b.is_filled(bin64_t(1,3)));
344 EXPECT_TRUE(b.is_filled(bin64_t(2,0)));
345 EXPECT_TRUE(b.is_filled(bin64_t(2,2)));
346 EXPECT_FALSE(b.is_filled(bin64_t(2,1)));
349 EXPECT_TRUE(b.is_filled(bin64_t(2,1)));
352 TEST(BinheapTest,Eat) {
355 b.push(bin64_t(0,1));
356 b.push(bin64_t(0,3));
357 b.push(bin64_t(2,0));
358 b.push(bin64_t(2,4));
360 EXPECT_EQ(bin64_t(2,0),b.pop());
361 EXPECT_EQ(bin64_t(2,4),b.pop());
362 EXPECT_EQ(bin64_t::none(),b.pop());
364 for (int i=0; i<64; i++) {
365 b.push(bin64_t(0,i));
367 b.push(bin64_t(5,0));
368 EXPECT_EQ(bin64_t(5,0),b.pop());
369 for (int i=32; i<64; i++)
370 EXPECT_EQ(bin64_t(0,i),b.pop());
374 TEST(BinsTest,RangeOpTest) {
380 a.range_or(b,bin64_t(1,0));
381 EXPECT_TRUE(a.is_filled(bin64_t(1,0)));
382 EXPECT_FALSE(a.is_filled(bin64_t(1,1)));
388 f.range_remove(s,bin64_t(2,1));
390 EXPECT_TRUE(f.is_filled(bin64_t(2,0)));
391 EXPECT_FALSE(f.is_filled(bin64_t(0,4)));
392 EXPECT_TRUE(f.is_filled(bin64_t(0,5)));
401 TEST(BinsTest,CoarseBitmap) {
404 union {uint16_t i16[2]; uint32_t i32;};
405 b.to_coarse_bitmap(i16,bin64_t(5,0),0);
406 EXPECT_EQ((1<<16)-1,i32);
408 b.set(bin64_t(14,0));
410 b.to_coarse_bitmap(i16,bin64_t(15,0),10);
411 EXPECT_EQ((1<<16)-1,i32);
414 rough.set(bin64_t(1,0));
415 rough.set(bin64_t(0,2));
417 rough.to_coarse_bitmap(i16,bin64_t(6,0),1);
421 ladder.set(bin64_t(6,2));
422 ladder.set(bin64_t(5,2));
423 ladder.set(bin64_t(4,2));
424 ladder.set(bin64_t(3,2));
425 ladder.set(bin64_t(2,2));
426 ladder.set(bin64_t(1,2));
427 ladder.set(bin64_t(0,2));
429 ladder.to_coarse_bitmap(i16,bin64_t(8,0),3);
430 EXPECT_EQ(0x00ff0f34,i32);
433 bin.set(bin64_t(3,0));
434 bin.set(bin64_t(0,8));
436 bin.to_coarse_bitmap(i16,bin64_t(4,0),0);
437 EXPECT_EQ((1<<9)-1,i32);
440 bin.to_coarse_bitmap(i16,bin64_t(7,0),3);
444 bin.to_coarse_bitmap(i16,bin64_t(4,0),3);
448 bin.to_coarse_bitmap(i16,bin64_t(2,0),1);
454 bm.set(bin64_t(6,0));
455 bm.to_coarse_bitmap((uint16_t*)&bigint,bin64_t(6,0),0);
456 EXPECT_EQ( 0xffffffffffffffffULL, bigint );
460 /*TEST(BinsTest,AddSub) {
464 ASSERT_TRUE(b.contains(2));
465 ASSERT_TRUE(b.contains(14));
466 ASSERT_FALSE(b.contains(3));
467 ASSERT_FALSE(b.contains(22));
468 ASSERT_TRUE(b.contains(12));
470 ASSERT_FALSE(b.contains(12));
471 ASSERT_FALSE(b.contains(14));
472 ASSERT_FALSE(b.contains(11));
473 ASSERT_TRUE(b.contains(10));
477 TEST(BinsTest,Peaks) {
478 bin::vec peaks = bin::peaks(11);
479 ASSERT_EQ(3,peaks.size());
480 ASSERT_EQ(15,peaks[0]);
481 ASSERT_EQ(18,peaks[1]);
482 ASSERT_EQ(19,peaks[2]);
485 TEST(BinsTest,Performance) {
489 double b_time, s_time;
493 for(int i=1; i<(1<<20); i++)
495 //b_size = b.bits.size();
497 b_time = ((double) (end - start)) / CLOCKS_PER_SEC;
498 //ASSERT_EQ(1,b.bits.size());
501 for(int i=1; i<(1<<20); i++)
505 s_time = ((double) (end - start)) / CLOCKS_PER_SEC;
507 printf("bins: %f (%i), set: %f (%i)\n",b_time,b_size,s_time,s_size);
510 int main (int argc, char** argv) {
511 testing::InitGoogleTest(&argc, argv);
512 return RUN_ALL_TESTS();