/*============================================================================
  KWSys - Kitware System Library
  Copyright 2000-2009 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 "kwsysPrivate.h"

#if defined(_MSC_VER)
# pragma warning (disable:4786)
#endif

#include KWSYS_HEADER(FStream.hxx)
#include <string.h>
#ifdef __BORLANDC__
# include <mem.h> /* memcmp */
#endif

// Work-around CMake dependency scanning limitation.  This must
// duplicate the above list of headers.
#if 0
# include "FStream.hxx.in"
#endif

#include <iostream>

//----------------------------------------------------------------------------
static int testNoFile()
{
  kwsys::ifstream in_file("NoSuchFile.txt");
  if(in_file)
    {
    return 1;
    }

  return 0;
}

static const int num_test_files = 7;
static const int max_test_file_size = 45;

static kwsys::FStream::BOM expected_bom[num_test_files] =
{
  kwsys::FStream::BOM_None,
  kwsys::FStream::BOM_None,
  kwsys::FStream::BOM_UTF8,
  kwsys::FStream::BOM_UTF16LE,
  kwsys::FStream::BOM_UTF16BE,
  kwsys::FStream::BOM_UTF32LE,
  kwsys::FStream::BOM_UTF32BE
};

static unsigned char expected_bom_data[num_test_files][5] =
{
    {0},
    {0},
    {3, 0xEF, 0xBB, 0xBF},
    {2, 0xFF, 0xFE},
    {2, 0xFE, 0xFF},
    {4, 0xFF, 0xFE, 0x00, 0x00},
    {4, 0x00, 0x00, 0xFE, 0xFF},
};

static unsigned char file_data[num_test_files][max_test_file_size] =
{
    {1, 'H'},
    {11, 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'},
    {11, 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'},
    {22, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x20, 0x00,
    0x57, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6C, 0x00, 0x64, 0x00},
    {22, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x20,
    0x00, 0x57, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x6C, 0x00, 0x64},
    {44, 0x48, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00,
    0x6C, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
    0x57, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
    0x6C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00},
    {44, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x6C,
    0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x20,
    0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x72,
    0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x64},
};

//----------------------------------------------------------------------------
static int testBOM()
{
  // test various encodings in binary mode
  for(int i=0; i<num_test_files; i++)
    {
      {
      kwsys::ofstream out("bom.txt", kwsys::ofstream::binary);
      out.write(reinterpret_cast<const char*>(expected_bom_data[i]+1),
                *expected_bom_data[i]);
      out.write(reinterpret_cast<const char*>(file_data[i]+1),
                file_data[i][0]);
      }

    kwsys::ifstream in("bom.txt", kwsys::ofstream::binary);
    kwsys::FStream::BOM bom = kwsys::FStream::ReadBOM(in);
    if(bom != expected_bom[i])
      {
      std::cout << "Unexpected BOM " << i << std::endl;
      return 1;
      }
    char data[max_test_file_size];
    in.read(data, file_data[i][0]);
    if(!in.good())
      {
      std::cout << "Unable to read data " << i << std::endl;
      return 1;
      }

    if(memcmp(data, file_data[i]+1, file_data[i][0]) != 0)
      {
      std::cout << "Incorrect read data " << i << std::endl;
      return 1;
      }

    }

  return 0;
}


//----------------------------------------------------------------------------
int testFStream(int, char*[])
{
  int ret = 0;

  ret |= testNoFile();
  ret |= testBOM();

  return ret;
}
