--- /dev/null
+/*
+ *  binstest.cpp
+ *  serp++
+ *
+ *  Created by Victor Grishchenko on 3/22/09.
+ *  Copyright 2009 Delft Technical University. All rights reserved.
+ *
+ */
+#include <time.h>
+#include <set>
+#include <gtest/gtest.h>
+#include "bins.h"
+
+
+TEST(BinsTest,Routines) {
+
+    uint32_t cell = (3<<10) | (3<<14) | (3<<0);
+    uint16_t correct = (1<<5) | (1<<7) | (1<<0);
+    uint16_t joined  = bins::join32to16(cell);
+    EXPECT_EQ(correct,joined);
+    
+    uint32_t split = bins::split16to32(correct);
+    EXPECT_EQ(cell,split);
+    
+    EXPECT_EQ(bins::NOJOIN,bins::join32to16(cell|4));
+
+}
+
+TEST(BinsTest,SetGet) {
+
+    bins bs;
+    bin64_t b3(1,0), b2(0,1), b4(0,2), b6(1,1), b7(2,0);
+    bs.set(b3);
+    //bs.dump("set done");
+    EXPECT_EQ(bins::FILLED,bs.get(b3));
+    //bs.dump("set checkd");
+    EXPECT_EQ(bins::FILLED,bs.get(b2));
+    //bs.dump("get b2 done");
+    EXPECT_EQ(bins::FILLED,bs.get(b3));
+    //bs.dump("get b3 done");
+    EXPECT_EQ(bins::EMPTY,bs.get(b4));
+    EXPECT_EQ(bins::EMPTY,bs.get(b6));
+    EXPECT_NE(bins::FILLED,bs.get(b7));
+    EXPECT_NE(bins::EMPTY,bs.get(b7));
+    EXPECT_EQ(bins::FILLED,bs.get(b3));
+    bs.set(bin64_t(1,1));
+    EXPECT_EQ(bins::FILLED,bs.get(bin64_t(2,0)));
+
+}
+
+TEST(BinsTest,Iterator) {
+    bins b;
+    b.set(bin64_t(3,1));
+    iterator i(&b,0,false);
+    while (!i.solid())
+        i.left();
+    EXPECT_EQ(bin64_t(3,0),i.bin());
+    EXPECT_EQ(false,i.deep());
+    EXPECT_EQ(true,i.solid());
+    EXPECT_EQ(bins::EMPTY,*i);
+    i.next();
+    EXPECT_EQ(bin64_t(3,1),i.bin());
+    EXPECT_EQ(false,i.deep());
+    EXPECT_EQ(true,i.solid());
+    EXPECT_EQ(bins::FILLED,*i);
+    i.next();
+    EXPECT_TRUE(i.end());
+}
+
+TEST(BinsTest,Chess) {
+    bins chess16;
+    for(int i=0; i<15; i++)
+        chess16.set(bin64_t(0,i), (i&1)?bins::FILLED:bins::EMPTY);
+    chess16.set(bin64_t(0,15), bins::FILLED);
+    for(int i=0; i<16; i++)
+        EXPECT_EQ((i&1)?bins::FILLED:bins::EMPTY, chess16.get(bin64_t(0,i)));
+    EXPECT_NE(bins::FILLED,chess16.get(bin64_t(4,0)));
+    EXPECT_NE(bins::EMPTY,chess16.get(bin64_t(4,0)));
+    for(int i=0; i<16; i+=2)
+        chess16.set(bin64_t(0,i), bins::FILLED);
+    EXPECT_EQ(bins::FILLED,chess16.get(bin64_t(4,0)));
+    EXPECT_EQ(bins::FILLED,chess16.get(bin64_t(2,3)));
+    
+    chess16.set(bin64_t(4,1),bins::FILLED);
+    EXPECT_EQ(bins::FILLED,chess16.get(bin64_t(5,0)));
+}
+
+TEST(BinsTest,Staircase) {
+    
+    const int TOPLAYR = 44;
+    bins staircase;
+    for(int i=0;i<TOPLAYR;i++)
+        staircase.set(bin64_t(i,1),bins::FILLED);
+    
+    EXPECT_NE(bins::FILLED,staircase.get(bin64_t(TOPLAYR,0)));
+    EXPECT_NE(bins::EMPTY,staircase.get(bin64_t(TOPLAYR,0)));
+
+    staircase.set(bin64_t(0,0),bins::FILLED);
+    EXPECT_EQ(bins::FILLED,staircase.get(bin64_t(TOPLAYR,0)));
+
+}
+
+TEST(BinsTest,Hole) {
+    
+    bins hole;
+    hole.set(bin64_t(8,0),bins::FILLED);
+    hole.set(bin64_t(6,1),bins::EMPTY);
+    hole.set(bin64_t(6,2),bins::EMPTY);
+    EXPECT_EQ(bins::FILLED,hole.get(bin64_t(6,0)));
+    EXPECT_EQ(bins::FILLED,hole.get(bin64_t(6,3)));
+    EXPECT_NE(bins::FILLED,hole.get(bin64_t(8,0)));
+    EXPECT_NE(bins::EMPTY,hole.get(bin64_t(8,0)));
+    EXPECT_EQ(bins::EMPTY,hole.get(bin64_t(6,1)));
+    
+}
+
+TEST(BinsTest,Find){
+    
+    bins hole;
+    hole.set(bin64_t(4,0),bins::FILLED);
+    hole.set(bin64_t(1,1),bins::EMPTY);
+    hole.set(bin64_t(0,7),bins::EMPTY);
+    bin64_t f = hole.find(bin64_t(4,0),0);
+    EXPECT_EQ(bin64_t(0,2),f);
+    
+}
+
+TEST(BinsTest,Stripes) {
+    
+    bins zebra;
+    zebra.set(bin64_t(5,0));
+    zebra.set(bin64_t(3,1),bins::EMPTY);
+    zebra.set(bin64_t(1,12),bins::EMPTY);
+    zebra.set(bin64_t(1,14),bins::EMPTY);
+    int count;
+    uint64_t *stripes = zebra.get_stripes(count);
+    EXPECT_EQ(9,count);
+    EXPECT_EQ(0,stripes[0]);
+    EXPECT_EQ(0,stripes[1]);
+    EXPECT_EQ(8,stripes[2]);
+    EXPECT_EQ(16,stripes[3]);
+    EXPECT_EQ(24,stripes[4]);
+    EXPECT_EQ(26,stripes[5]);
+    EXPECT_EQ(28,stripes[6]);
+    EXPECT_EQ(30,stripes[7]);
+    EXPECT_EQ(32,stripes[8]);
+    free(stripes);
+
+}
+
+TEST(BinsTest,StripesAgg) {
+    
+    bins zebra;
+    zebra.set(bin64_t(0,1));
+    zebra.set(bin64_t(0,2));
+    int count;
+    uint64_t *stripes = zebra.get_stripes(count);
+    EXPECT_EQ(3,count);
+    EXPECT_EQ(0,stripes[0]);
+    EXPECT_EQ(1,stripes[1]);
+    EXPECT_EQ(3,stripes[2]);
+    free(stripes);
+    
+}    
+
+TEST(BinsTest,Alloc) {
+
+    bins b;
+    b.set(bin64_t(1,0));
+    b.set(bin64_t(1,1));
+    b.set(bin64_t(1,0),bins::EMPTY);
+    b.set(bin64_t(1,1),bins::EMPTY);
+    EXPECT_EQ(1,b.size());
+
+}
+
+/*TEST(BinsTest,AddSub) {
+       bins 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) {
+       bins b;
+       std::set<int> 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();
+}