#include <mazematrixD2.h>
#include <mazematrixD2createmaze.h>
#include <mazematrixmapD2.h>
#include <mazematrixD2test.h>

string mazematrixD2test::doc[] = 
{
  "",
  "Link a simple maze and print it out.",
  "From a simple maze, generate a relative map - local coord system.",
  "Create a small maze, then use mazematrixmapD2 to map it and test coordinates.",
  "Testing mazematrixD2 serialization."
};


void mazematrixD2test::test01()
{
  mazematrixD2<uint> mz(3,3);

  uint k;
  k = mz.add();
  uint k2;
  k2 = mz.add();
  mz.link(k,1,1,3);

  mz.link(1,1,2);
  mz.link(2,1,3);
  mz.link(3,2,6);
  mz.link(6,3,5);
  mz.link(5,3,4);
  mz.link(4,2,7);
  mz.link(7,1,8);
  mz.link(8,1,9);
  mz.link(9,1,k2);
  
  for (uint i=1; i<mz.vi.size(); ++i)
  {
    cout << (string)mz.vi[i] << endl;
  }

  assert(mz.valid());
}


void mazematrixD2test::test02()
{
  mazematrixD2<uint> mz(3,3);

  uint k;
  k = mz.add();
  uint k2;
  k2 = mz.add();
  mz.link(k,1,1,3);

  mz.link(1,1,2);
  mz.link(2,1,3);
  mz.link(3,2,6);
  mz.link(6,3,5);
  mz.link(5,3,4);
  mz.link(4,2,7);
  mz.link(7,1,8);
  mz.link(8,1,9);
  mz.link(9,1,k2);
  
  for (uint i=1; i<mz.vi.size(); ++i)
  {
    cout << (string)mz.vi[i] << endl;
  }

  assert(mz.valid());

  mazematrixmapD2<uint,int> mmap(mz,1,1);

  mmap.relativeto(1);
  mmap.eval();

  for (mmap.reset(); !mmap; ++mmap)
  {
    cout << "id: " << mmap.currentIndex() << "  pos: " << mmap.currentPosition() << endl; 
  }

}


int mazematrixD2test::unittest01()
{
  mazematrixD2<uint> mz(3,3);

  uint k;
  k = mz.add();
  uint k2;
  k2 = mz.add();
  mz.link(k,1,1,3);

  mz.link(1,1,2);
  mz.link(2,1,3);
  mz.link(3,2,6);
  mz.link(6,3,5);
  mz.link(5,3,4);
  mz.link(4,2,7);
  mz.link(7,1,8);
  mz.link(8,1,9);
  mz.link(9,1,k2);
  
  for (uint i=1; i<mz.vi.size(); ++i)
  {
    cout << (string)mz.vi[i] << endl;
  }

  assert(mz.valid());

  mazematrixmapD2<uint,int> mmap(mz,1,1);

  mmap.relativeto(1);
  mmap.eval();

  for (mmap.reset(); !mmap; ++mmap)
  {
    cout << "id: " << mmap.currentIndex() << "  pos: " << mmap.currentPosition() << endl; 
  }

  bool res=true;
  res &= (mmap.ipt[1]==point2<int>(0,0));

  string pos[] = 
  { 
    "0 0", "0 0", "1 0", "2 0",  
    "0 -1", "1 -1", "2 -1", "0 -2", 
    "1 -2", "2 -2", "-1 0", "3 -2" 
  };
  uint possize = sizeof(pos)/sizeof(string);
  cout << SHOW(possize) << endl;

  point2<int> pi;
  for (uint i=1; i<possize; ++i)
  {
    pi.serializeInverse(pos[i]);
    res &= (mmap.ipt[i]==pi);
    cout << SHOW(i) << " " << SHOW(res) << endl;
  }

  if (res==false)
    return 1;

  return 0;
}

int mazematrixD2test::unittest02()
{
  mazematrixD2<uint> mz(4,4);
  mazematrixD2createmaze<uint> mc(mz);
  mc.buildpropermaze();

  string s1=(string)mz;
  cout << s1 << endl;

  mazematrixD2<uint> mz2;
  mz2.serializeInverse(s1);
  string s2=(string)mz2;
  cout << s2 << endl;

  if (s1==s2)
    return 0;
  
  return 1;
}





