//  fstream_test.cpp  ------------------------------------------------------------------//

//  Copyright Beman Dawes 2002

//  Distributed under the Boost Software License, Version 1.0.
//  See http://www.boost.org/LICENSE_1_0.txt

//  Library home page: http://www.boost.org/libs/filesystem

#define BOOST_FILESYSTEM_VERSION 3

#include <boost/config.hpp>

# if defined( BOOST_NO_STD_WSTRING )
#   error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
# endif

#include <boost/config/warning_disable.hpp>

//  See deprecated_test for tests of deprecated features
#ifndef BOOST_FILESYSTEM_NO_DEPRECATED 
#  define BOOST_FILESYSTEM_NO_DEPRECATED
#endif
#ifndef BOOST_SYSTEM_NO_DEPRECATED 
#  define BOOST_SYSTEM_NO_DEPRECATED
#endif

#include <boost/filesystem/fstream.hpp>
#include <boost/filesystem/operations.hpp>
#include <string>
#include <iostream>
#include <cstdio> // for std::remove

#include <boost/filesystem/detail/utf8_codecvt_facet.hpp>

namespace fs = boost::filesystem;

#include <boost/config.hpp>
#ifdef BOOST_NO_STDC_NAMESPACE
  namespace std { using ::remove; }
#endif

#include <boost/detail/lightweight_test.hpp>

#if defined(_MSC_VER)
# pragma warning(push) // Save warning settings.
# pragma warning(disable : 4428) // Disable universal-character-name encountered in source warning.
#endif 

namespace
{
  bool cleanup = true;
  
  void test(const fs::path & p)
  {
    fs::remove(p);
    {
      std::cout << " in test 1\n";
      fs::filebuf fb1;
      fb1.open(p, std::ios_base::out);
      BOOST_TEST(fb1.is_open());
    }
    {
      std::cout << " in test 2\n";
      fs::filebuf fb2;
      fb2.open(p, std::ios_base::in);
      BOOST_TEST(fb2.is_open());
    }
    {
      std::cout << " in test 3\n";
      fs::ifstream tfs(p);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 4\n";
      fs::ifstream tfs(p / p.filename()); // should fail
      BOOST_TEST(!tfs.is_open());
    }
    {
      std::cout << " in test 5\n";
      fs::ifstream tfs(p, std::ios_base::in);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 6\n";
      fs::ifstream tfs;
      tfs.open(p);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 7\n";
      fs::ifstream tfs;
      tfs.open(p, std::ios_base::in);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 8\n";
      fs::ofstream tfs(p);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 9\n";
      fs::ofstream tfs(p, std::ios_base::out);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 10\n";
      fs::ofstream tfs;
      tfs.open(p);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 11\n";
      fs::ofstream tfs;
      tfs.open(p, std::ios_base::out);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 12\n";
      fs::fstream tfs(p);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 13\n";
      fs::fstream tfs(p, std::ios_base::in|std::ios_base::out);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 14\n";
      fs::fstream tfs;
      tfs.open(p);
      BOOST_TEST(tfs.is_open());
    }
    {
      std::cout << " in test 15\n";
      fs::fstream tfs;
      tfs.open(p, std::ios_base::in|std::ios_base::out);
      BOOST_TEST(tfs.is_open());
    }

    if (cleanup)
      fs::remove(p);

  } // test
} // unnamed namespace

int main(int argc, char*[])
{
  if (argc > 1) cleanup = false;

  // test narrow characters
  std::cout << "narrow character tests:\n";
  test("fstream_test_foo");


  // So that tests are run with known encoding, use Boost UTF-8 codecvt
  std::locale global_loc = std::locale();
  std::locale loc(global_loc, new fs::detail::utf8_codecvt_facet);
  fs::path::imbue(loc);

  // test with some wide characters
  //  \u2780 is circled 1 against white background == e2 9e 80 in UTF-8
  //  \u2781 is circled 2 against white background == e2 9e 81 in UTF-8
  //  \u263A is a white smiling face
  std::cout << "\nwide character tests:\n";
  test(L"fstream_test_\u2780\u263A");

  return ::boost::report_errors();
}
