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

#include <point.h>
#include <printvector.h>
#include <stringserialization.h>
#include <stringserializationtest.h>

string stringserializationtest::doc[] = 
{
  "",
  "Write and read a double array.",
  "Write and read a 2D array of points.",
  "Test file serialization.",
  "Test vectorfile serialization.",
  "Unit test htmlstring."
};


void stringserializationtest::test01()
{
  double data[5] = {1.0,3.0,5.0,7.0,9.0}; 
  vector<double> v1(data,data+5);

  cout << "Writing a vector to a string." << endl;

  bool result;
  string str;
  result=vectorstring::serialize(str,v1);
  cout << SHOW(result) << endl;
  cout << "*" << str << "*" << endl;
  cout << endl;

  cout << "Reading a vector from a string - expecting result=1." << endl;
  vector<double> v3;
  result=vectorstring::deserialize(v3,str);
  cout << SHOW(result) << endl;
  cout << SHOW(v3.size()) << endl;
  cout << v3 << endl;
  cout << endl;

  cout << "Putting some garbage on the end of the string - expecting result=0." << endl;
  str += " crap";
  cout << "Reading a vector from a string." << endl;
  vector<double> v2;
  result=vectorstring::deserialize(v2,str);
  cout << SHOW(result) << endl;
  cout << SHOW(v2.size()) << endl;
  cout << v2 << endl;
}

void stringserializationtest::test02()
{
  cout << "Testing vectorstring serialization with a point2<double> type." << endl;

  typedef point2<double> pt2;

  pt2 data[3] = { pt2(.2,.3), pt2(-.1,0.0), pt2(5.0,4.0) };
  vector<pt2> v1(data,data+3);

  bool result;
  string str;
  result=vectorstring::serialize(str,v1);
  cout << SHOW(result) << endl;
  cout << "*" << str << "*" << endl;
  cout << endl;

  cout << "Reading a vector from a string - expecting result=1." << endl;
  vector<pt2> v3;
  result=vectorstring::deserialize(v3,str);
  cout << SHOW(result) << endl;
  cout << SHOW(v3.size()) << endl;
  cout << print(v3,"\n") << endl;
  cout << endl;
}

void stringserializationtest::test03()
{
  string s1;
  s1 += "This is a silly sentence. I have to make a\n";
  s1 += "file from a string. Hopefully this will be\n";
  s1 += "written out as a file and converted back as\n";
  s1 += " a string. Then I will compare the strings.";

  cout << "Writing a string to a file." << endl;
  cout << "string begin:" << endl;
  cout << s1;
  cout << "string end:" << endl;
  cout << endl;
  stringc filename("temp01.txt");
  cout << "filename: " << filename << endl;
  cout << "Writing " << filename << endl;
  filestring::deserialize(filename,s1);
  string s2;
  filestring::serialize(s2,filename);
  cout << s2 << endl;
  cout << SHOW(s1.size()) << endl;
  cout << SHOW(s2.size()) << endl;
  cout << SHOW((s1==s2)) << endl;
}


void stringserializationtest::test04()
{
  typedef point2<double> pt2;

  pt2 data[3] = { pt2(.2,.3), pt2(-.1,0.0), pt2(5.0,4.0) };
  vector<pt2> v1(data,data+3);

  bool result;
  string filename="temp02.txt";

  cout << "Writing 2D vector to file " << filename << endl;
  result=vectorfile::serialize(filename,v1);
  assert(result);
  vector<pt2> v2;
  result=vectorfile::deserialize(v2,filename);
  cout << v2 << endl;

  cout << SHOW(v1.size()) << endl;
  cout << SHOW(v2.size()) << endl;
  cout << "Testing if the two vectors are equal." << endl;
  cout << SHOW((v1==v2)) << endl;
}


int stringserializationtest::unittest01()
{

  string s1="&amp;x1-&gt;free_mem();";

  assertreturnOS(htmlstring::ishtml(s1)); 

  string s2;
  htmlstring::serialize(s2,s1);
  cout << SHOW(s1) << endl;
  cout << SHOW(s2) << endl;
  string s3;
  htmlstring::serializeInverse(s3,s2);
  cout << SHOW(s3) << endl;

  assertreturnOS(s1==s3);

  return 0;
}






