// L-35 MCS 360 Fri 12 Nov 2010 : mcs360_btree_test.cpp

/* Tests the B-tree. */

#include "mcs360_btree.h"

#include <iostream>
using namespace std;
using namespace mcs360_btree;

void write_data ( B_Tree<int,5> T );
// writes the data at the root of the tree

void write ( int k, B_Tree<int,5> T );
// writes the tree T, initialize with k equal to 0 

bool is_in ( B_Tree<int,5> T, int i );
// returns true if i occurs in T, false otherwise

void interactive_test();
// a first test on our B-tree

int main()
{ 
   interactive_test();

   return 0;
}

void interactive_test()
{
   int v[3] = {2,3,4};

   B_Tree<int,5> T(3,v);

   cout << "#items at root : "
        << T.get_size() << endl;

   cout << "data at the tree :";
   write_data(T);

   B_Tree<int,5> c[4];
   int u[3] = {4,8,12};
   int w[3] = {1,2,3};    B_Tree<int,5> Tw(3,w); c[0] = Tw;
   int x[3] = {5,6,7};    B_Tree<int,5> Tx(3,x); c[1] = Tx;
   int y[3] = {9,10,11};  B_Tree<int,5> Ty(3,y); c[2] = Ty;
   int z[3] = {13,14,15}; B_Tree<int,5> Tz(3,z); c[3] = Tz;
   B_Tree<int,5> Tu(3,u,c);

   write(0,Tu);

   cout << "give element to search for : ";
   int item; cin >> item;

   int p = Tu.search(item); 
   if(p == Tu.get_size())
      cout << item << " at last child ?" << endl;
   else if(Tu.get_data()[p] == item)
      cout << item << " is at position " << p << endl;
   else
      cout << item << " at child " << p << " ?" << endl;

   if(is_in(Tu,item))
      cout << item << " occurs in the tree" << endl;
   else
      cout << item << " does not occur in the tree" << endl;
}

void write_data ( B_Tree<int,5> T )
{
   int *d = T.get_data();

   for(int i=0; i<T.get_size(); i++)
      cout << " " << d[i];
   cout << endl;
}

void write ( int k, B_Tree<int,5> T )
{
   for(int i=0; i<k; i++) cout << "  ";
   write_data(T);
   for(int i=0; i<T.get_size()+1; i++)
      if(!T.is_null_child(i)) write(k+1,T.get_child(i));
}

bool is_in ( B_Tree<int,5> T, int i )
{
   int p = T.search(i);

   if(p == T.get_size())
   {
      if(T.is_null_child(p))
         return false;
      else
         return is_in(T.get_child(p),i);
   }
   else if(T.get_data()[p] == i)
      return true;
   else if(T.is_null_child(p))
      return false;
   else
      return is_in(T.get_child(p),i);
}

