/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2013 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmRST.h"

#include "cmSystemTools.h"

void reportLine(std::ostream& os, bool ret, std::string line, bool eol)
{
  if(ret)
    {
    os << "\"" << line << "\" (" << (eol?"with EOL":"without EOL") << ")";
    }
  else
    {
    os << "EOF";
    }
}

int testRST(int, char*[])
{
  std::string dir = cmSystemTools::GetFilenamePath(__FILE__);
  if(dir.empty())
    {
    dir = ".";
    }
  std::string a_name = "testRST.actual";
  std::string e_name = dir + "/testRST.expect";

  // Process the test RST file.
  {
  std::string fname = dir + "/testRST.rst";
  std::ofstream fout(a_name.c_str());
  if(!fout)
    {
    std::cerr << "Could not open output " << a_name << std::endl;
    return 1;
    }

  cmRST r(fout, dir);
  if(!r.ProcessFile(fname))
    {
    std::cerr << "Could not open input " << fname << std::endl;
    return 1;
    }
  }

  // Compare expected and actual outputs.
  std::ifstream e_fin(e_name.c_str());
  std::ifstream a_fin(a_name.c_str());
  if(!e_fin)
    {
    std::cerr << "Could not open input " << e_name << std::endl;
    return 1;
    }
  if(!a_fin)
    {
    std::cerr << "Could not open input " << a_name << std::endl;
    return 1;
    }
  int lineno = 0;
  bool e_ret;
  bool a_ret;
  do
    {
    std::string e_line;
    std::string a_line;
    bool e_eol;
    bool a_eol;
    e_ret = cmSystemTools::GetLineFromStream(e_fin, e_line, &e_eol);
    a_ret = cmSystemTools::GetLineFromStream(a_fin, a_line, &a_eol);
    ++lineno;
    if(e_ret != a_ret || e_line != a_line || e_eol != a_eol)
      {
      a_fin.seekg(0, std::ios::beg);
      std::cerr << "Actual output does not match that expected on line "
                << lineno << "." << std::endl << "Expected ";
      reportLine(std::cerr, e_ret, e_line, e_eol);
      std::cerr << " but got ";
      reportLine(std::cerr, a_ret, a_line, a_eol);
      std::cerr << "." << std::endl
                << "Actual output:" << std::endl
                << a_fin.rdbuf();
      return 1;
      }
    } while(e_ret && a_ret);
  return 0;
}
