/*
 * NICE-Core - efficient algebra and computer vision methods
 *  - libiocompression - An iocompression/template for new NICE libraries
 * See file License for license information.
 */
#include "Testgzbinstream.h"
#include <string>
#include <vector>
#include <exception>

using namespace NICE;

enum ENUM { ONE=1, TWO=2, FIVE=5 };

CPPUNIT_TEST_SUITE_REGISTRATION( Testgzbinstream );

void Testgzbinstream::setUp() {
}

void Testgzbinstream::tearDown() {
  remove("tmp.bgz");
}

void Testgzbinstream::testConstructor() {
}

void Testgzbinstream::testOperators() {
#ifdef NICE_USELIB_ZLIB
  int i= rand();
  char c= rand();
  short s = rand();
  long l = rand();
  unsigned int ui = rand();
  unsigned short us = rand();
  unsigned char uc = rand();
  unsigned long ul = rand();
  float f = rand();
  double d = rand();
  long long ll = rand();
  unsigned long long ull = rand();
  long double ld = rand();
    ENUM enu=FIVE;
    std::vector<double> vd(10);
    for(uint i=0;i<vd.size();i++)
        vd[i]=i;
    std::vector<std::vector<std::string> > vvs(3);
  for(uint i=0;i<vvs.size();i++) {
        vvs[i].resize(3);
      for(int j=0;j<3;j++) {
            std::string x="test-";
          vvs[i][j]= x + (char)(i+'0')+(char)(j+'0');
        }
  }
  std::string str="string";
  ogzbinstream file("tmp.bgz");
  char array[]="array";
  file << 'x' << i << 'x' << c << 'x' << s << 'x' << l << 'x' << ll 
       << 'x' << f << 'x' << d << 'x' << ld
       << 'x' << ui << 'x' << uc << 'x' << us << 'x' << ul << 'x' << ull
     << "array" << 'x' << str << 'x' << vd << 'x' << vvs << 'x'
         << (char)enu << 'x';
     ;
  file.close();
  int i_new= 0;
  char c_new= 0;
  short s_new= 0;
  long l_new= 0;
  unsigned int ui_new= 0;
  unsigned short us_new= 0;
  unsigned char uc_new= 0;
  unsigned long ul_new= 0;
  float f_new= 0;
  double d_new= 0;
  long long ll_new= 0;
  unsigned long long ull_new= 0;
  long double ld_new= 0;
  std::string str_new;
  char t[18];
  char buf[10];
    std::vector<double> vd_new;
    std::vector<std::vector<std::string> > vvs_new;
    ENUM enu_new;
    unsigned char enu_char;
  igzbinstream in("tmp.bgz");
  in  >> t[0] >> i_new >> t[1] >> c_new >> t[2] >> s_new >> t[3] >> l_new >> t[4] >> ll_new
      >> t[5] >> f_new >> t[6] >> d_new >> t[7] >> ld_new 
      >> t[8] >> ui_new >> t[9] >> uc_new >> t[10] >> us_new >> t[11] >> ul_new >> t[12] >> ull_new
    >> buf >> t[13] >> str_new >> t[14] >> vd_new >> t[15] >> vvs_new >>t[16] >> enu_char >> t[17];
     ;
    enu_new=(ENUM)enu_char;
  in.close();
    CPPUNIT_ASSERT_EQUAL(i, i_new);
    CPPUNIT_ASSERT_EQUAL(c, c_new);
    CPPUNIT_ASSERT_EQUAL(s, s_new);
    CPPUNIT_ASSERT_EQUAL(l, l_new);
    CPPUNIT_ASSERT_EQUAL(ll, ll_new);
    CPPUNIT_ASSERT_EQUAL(ui, ui_new);
    CPPUNIT_ASSERT_EQUAL(uc, uc_new);
    CPPUNIT_ASSERT_EQUAL(us, us_new);
    CPPUNIT_ASSERT_EQUAL(ul, ul_new);
    CPPUNIT_ASSERT_EQUAL(ull, ull_new);
    CPPUNIT_ASSERT_EQUAL(f, f_new);
    CPPUNIT_ASSERT_EQUAL(d, d_new);
    CPPUNIT_ASSERT_EQUAL(ld, ld_new);
    CPPUNIT_ASSERT_EQUAL(str, str_new);
  for(uint i=0;i<strlen(array);i++) {
      CPPUNIT_ASSERT_EQUAL(buf[i], array[i]);
  }
  for(uint i=0;i<vd.size();i++) {
      CPPUNIT_ASSERT_EQUAL(vd[i], vd_new[i]);
  }
  for(uint i=0;i<vvs.size();i++) {
      for(uint j=0;j<vvs[i].size();j++) {
          CPPUNIT_ASSERT_EQUAL(vvs[i][j], vvs_new[i][j]);
        }
  }
    CPPUNIT_ASSERT_EQUAL(enu, enu_new);
  for(int i=0;i<18;i++) {
      CPPUNIT_ASSERT_EQUAL(t[i], 'x');
  }
#endif
}