0b4293679f8315d0c567f1e70bc282d39ccf6f39
[swift-upb.git] / tests / binstest2.cpp
1 /*
2  *  binstest.cpp
3  *  serp++
4  *
5  *  Created by Victor Grishchenko on 3/22/09.
6  *  Copyright 2009 Delft University of Technology. All rights reserved.
7  *
8  */
9 #include <time.h>
10 #include <set>
11 #include <gtest/gtest.h>
12 #include "bins.h"
13
14
15 TEST(BinsTest,Routines) {
16
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);
21     
22     uint32_t split = binmap_t::split16to32(correct);
23     EXPECT_EQ(cell,split);
24     
25     EXPECT_EQ(binmap_t::NOJOIN,binmap_t::join32to16(cell|4));
26
27 }
28
29 TEST(BinsTest,SetGet) {
30
31     binmap_t bs;
32     bin64_t b3(1,0), b2(0,1), b4(0,2), b6(1,1), b7(2,0);
33     bs.set(b3);
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));
46     bs.set(bin64_t(1,1));
47     EXPECT_EQ(binmap_t::FILLED,bs.get(bin64_t(2,0)));
48
49 }
50
51 TEST(BinsTest,Iterator) {
52     binmap_t b;
53     b.set(bin64_t(3,1));
54     iterator i(&b,bin64_t(0,0),false);
55     while (!i.solid())
56         i.left();
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);
61     i.next();
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);
66     i.next();
67     EXPECT_TRUE(i.end());
68 }
69
70 TEST(BinsTest,Chess) {
71     binmap_t chess16;
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)));
83     
84     chess16.set(bin64_t(4,1),binmap_t::FILLED);
85     EXPECT_EQ(binmap_t::FILLED,chess16.get(bin64_t(5,0)));
86 }
87
88 TEST(BinsTest,Staircase) {
89     
90     const int TOPLAYR = 44;
91     binmap_t staircase;
92     for(int i=0;i<TOPLAYR;i++)
93         staircase.set(bin64_t(i,1),binmap_t::FILLED);
94     
95     EXPECT_NE(binmap_t::FILLED,staircase.get(bin64_t(TOPLAYR,0)));
96     EXPECT_NE(binmap_t::EMPTY,staircase.get(bin64_t(TOPLAYR,0)));
97
98     staircase.set(bin64_t(0,0),binmap_t::FILLED);
99     EXPECT_EQ(binmap_t::FILLED,staircase.get(bin64_t(TOPLAYR,0)));
100
101 }
102
103 TEST(BinsTest,Hole) {
104     
105     binmap_t 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)));
114     
115 }
116
117 TEST(BinsTest,Find){
118     
119     binmap_t hole;
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);
125     
126 }
127
128 TEST(BinsTest,Stripes) {
129     
130     binmap_t zebra;
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);
135     int count;
136     uint64_t *stripes = zebra.get_stripes(count);
137     EXPECT_EQ(9,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]);
147     free(stripes);
148
149 }
150
151 TEST(BinsTest,StripesAgg) {
152     
153     binmap_t zebra;
154     zebra.set(bin64_t(0,1));
155     zebra.set(bin64_t(0,2));
156     int count;
157     uint64_t *stripes = zebra.get_stripes(count);
158     EXPECT_EQ(3,count);
159     EXPECT_EQ(0,stripes[0]);
160     EXPECT_EQ(1,stripes[1]);
161     EXPECT_EQ(3,stripes[2]);
162     free(stripes);
163     
164 }    
165
166 TEST(BinsTest,Alloc) {
167
168     binmap_t b;
169     b.set(bin64_t(1,0));
170     b.set(bin64_t(1,1));
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());
174
175 }
176
177 TEST(BinsTest,Remove) {
178     
179     binmap_t b;
180     b.set(bin64_t(5,0));
181     binmap_t c;
182     c.set(bin64_t(2,0));
183     c.set(bin64_t(2,2));
184     b.remove(c);
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)));
190     
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));
198     
199     b1024.remove(b16);
200     b1024.remove(b8192);
201     
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)));
207     
208     b8192.set(bin64_t(2,3));
209     b16.remove(b8192);
210     EXPECT_EQ(binmap_t::EMPTY,b16.get(bin64_t(2,3)));
211     EXPECT_EQ(binmap_t::FILLED,b16.get(bin64_t(2,2)));
212     
213 }
214
215 TEST(BinsTest,FindFiltered) {
216     
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));
224     
225     bin64_t x = data.find_filtered(filter,bin64_t(4,0)).left_foot();
226     EXPECT_EQ(bin64_t(0,12),x);
227     
228 }
229
230
231 TEST(BinsTest, Cover) {
232     
233     binmap_t b;
234     b.set(bin64_t(2,0));
235     b.set(bin64_t(4,1));
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)));
239     //binmap_t c;
240     //EXPECT_EQ(bin64_t::ALL,b.cover(bin64_t(0,30)));
241     
242 }
243
244
245 TEST(BinsTest,FindFiltered2) {
246     
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());
256     
257 }
258     
259 TEST(BinsTest,CopyRange) {
260     binmap_t data, add;
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.copy_range(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)));
274 }
275
276 TEST(BinsTest, Mass) {
277     binmap_t b;
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());
282     b.clear();
283     EXPECT_TRUE(b.is_empty());
284     EXPECT_EQ(0,b.mass());
285
286     binmap_t b50;
287     for(int i=0; i<50; i++)
288         b50.set(bin64_t(4,i*2));
289     EXPECT_EQ(50<<4,b50.mass());
290 }
291
292 TEST(BinsTest,Twist) {
293     binmap_t b;
294     b.set(bin64_t(3,2));
295     EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(3,2)));
296     EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(3,3)));
297     b.twist(1<<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))
302         tw = tw.left();
303     tw = tw.twisted(1<<3);
304     EXPECT_EQ(bin64_t(3,2),tw);
305     b.twist(0);
306     EXPECT_EQ(binmap_t::FILLED,b.get(bin64_t(3,2)));
307     EXPECT_EQ(binmap_t::EMPTY,b.get(bin64_t(3,3)));
308 }
309
310 TEST(BinsTest,SeqLength) {
311     binmap_t b;
312     b.set(bin64_t(3,0));
313     b.set(bin64_t(1,4));
314     b.set(bin64_t(0,10));
315     b.set(bin64_t(3,2));
316     EXPECT_EQ(11,b.seq_length());
317 }
318
319 TEST(BinsTest,EmptyFilled) {
320     // 1112 3312  2111 ....
321     binmap_t b;
322     
323     EXPECT_TRUE(b.is_empty(bin64_t::ALL));
324     
325     b.set(bin64_t(1,0));
326     b.set(bin64_t(0,2));
327     b.set(bin64_t(0,6));
328     b.set(bin64_t(1,5));
329     b.set(bin64_t(0,9));
330     
331     EXPECT_FALSE(b.is_empty(bin64_t::ALL));
332     
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)));
339     
340     b.set(bin64_t(0,3));
341     b.set(bin64_t(0,7));
342     b.set(bin64_t(0,8));
343     
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)));    
347
348     b.set(bin64_t(1,2));
349     EXPECT_TRUE(b.is_filled(bin64_t(2,1)));    
350 }
351
352 TEST(BinheapTest,Eat) {
353     
354     binheap b;
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));
359     
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());
363     
364     for (int i=0; i<64; i++) {
365         b.push(bin64_t(0,i));
366     }
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());
371         
372 }
373
374 /*TEST(BinsTest,AddSub) {
375         binmap_t b;
376         b|=15;
377         b-=1;
378         ASSERT_TRUE(b.contains(2));
379         ASSERT_TRUE(b.contains(14));
380         ASSERT_FALSE(b.contains(3));
381         ASSERT_FALSE(b.contains(22));
382         ASSERT_TRUE(b.contains(12));
383         b-=13;
384         ASSERT_FALSE(b.contains(12));
385         ASSERT_FALSE(b.contains(14));
386         ASSERT_FALSE(b.contains(11));
387         ASSERT_TRUE(b.contains(10));
388 }
389
390
391 TEST(BinsTest,Peaks) {
392         bin::vec peaks = bin::peaks(11);
393         ASSERT_EQ(3,peaks.size());
394         ASSERT_EQ(15,peaks[0]);
395         ASSERT_EQ(18,peaks[1]);
396         ASSERT_EQ(19,peaks[2]);
397 }
398
399 TEST(BinsTest,Performance) {
400         binmap_t b;
401         std::set<int> s;
402         clock_t start, end;
403         double b_time, s_time;
404         int b_size, s_size;
405         
406         start = clock();
407         for(int i=1; i<(1<<20); i++)
408                 b |= bin(i);
409         //b_size = b.bits.size();
410         end = clock();  
411         b_time = ((double) (end - start)) / CLOCKS_PER_SEC;
412         //ASSERT_EQ(1,b.bits.size());
413         
414         start = clock();
415         for(int i=1; i<(1<<20); i++)
416                 s.insert(i);
417         s_size = s.size();
418         end = clock();
419         s_time = ((double) (end - start)) / CLOCKS_PER_SEC;
420         
421         printf("bins: %f (%i), set: %f (%i)\n",b_time,b_size,s_time,s_size);
422 }*/
423
424 int main (int argc, char** argv) {
425         testing::InitGoogleTest(&argc, argv);
426         return RUN_ALL_TESTS();
427 }