#define BOOST_TEST_MAIN 1
#include <boost/test/unit_test.hpp>

#include "CFeatureExtraction.h"
#include "CFeatureMapper.hpp"
#include "Base64.h"
#include <iostream>
#include <fstream>
#include "CMD5AndUrl.h"
#include "CVMatSerialization.h"
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include "CSignatureSerialization.h"


//____________________________________________________________________________//

BOOST_AUTO_TEST_CASE( deserialization )
{
  int i = 0;
  
  CFeatureMapper mapper;
  
  boost::filesystem::path contextRootDir = boost::filesystem::current_path() / "learntContext";
  mapper.LoadFeatureMappers(contextRootDir);
  
  // don't skip the whitespace while reading
  std::cin >> std::noskipws; //  >> std::ios_base::binary;
  
  std::ifstream mystream("./tests/mydump.txt");
  // use stream iterators to copy the stream to a string
  std::istream_iterator<unsigned char> it(mystream);
  std::istream_iterator<unsigned char> end;
  std::vector<unsigned char> input(it, end);
  
  std::string rep((char*)&input[0], input.size());
  
  CFeatureExtraction cextest;  
  
  cextest.DeserializeSignature(rep);
  
  // reports 'error in "test2": check i == 2 failed [0 != 2]'
  BOOST_CHECK_EQUAL( cextest.getSignature().m_histColor.rows, 1);
  BOOST_CHECK_EQUAL( cextest.getSignature().m_histColor.cols, 48);
  // ... TODO some more
}

//____________________________________________________________________________//

BOOST_AUTO_TEST_CASE( roundtrip )
{

  CFeatureMapper mapper;

  boost::filesystem::path contextRootDir = boost::filesystem::current_path() / "learntContext";
  mapper.LoadFeatureMappers(contextRootDir);
  
  // don't skip the whitespace while reading
  std::cin >> std::noskipws; //  >> std::ios_base::binary;
  
  std::ifstream mystream("./tests/stripes.jpg");
  // use stream iterators to copy the stream to a string
  std::istream_iterator<unsigned char> it(mystream);
  std::istream_iterator<unsigned char> end;
  std::vector<unsigned char> input(it, end);
  
  cv::Mat mat = Mantis::readImage(input);
  
  CFeatureExtraction cex(mat, mapper);  
  //  std::cerr << "extractor constructed" << std::endl;
  
  std::string rep = cex.SerializeSignature();

  CFeatureExtraction cextest;  
  
  cextest.DeserializeSignature(rep);
  
  cv::Mat diff = (cextest.getSignature().m_histColor != cex.getSignature().m_histColor);
    
  BOOST_CHECK_EQUAL( cv::countNonZero(diff), 0);
}
