//  libs/filesystem/test/convenience_test.cpp  -----------------------------------------//

//  Copyright Beman Dawes, 2002
//  Copyright Vladimir Prus, 2002
//  Use, modification, and distribution is subject to the Boost Software
//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
//  http://www.boost.org/LICENSE_1_0.txt)

//  See library home page at 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/convenience.hpp>
namespace fs = boost::filesystem;
using fs::path;
namespace sys = boost::system;

#include <boost/detail/lightweight_test.hpp>
#include <boost/bind.hpp>
#include <fstream>
#include <iostream>

namespace
{
  template< typename F >
    bool throws_fs_error(F func)
  {
    try { func(); }

    catch (const fs::filesystem_error &)
    {
      return true;
    }
    return false;
  }

    void create_recursive_iterator(const fs::path & ph)
    {
      fs::recursive_directory_iterator it(ph);
    }
}

//  ------------------------------------------------------------------------------------//

int main(int, char*[])
{

//  create_directories() tests  --------------------------------------------------------//

  BOOST_TEST(!fs::create_directories(""));  // should be harmless
  BOOST_TEST(!fs::create_directories("/")); // ditto

  path unique_dir = fs::unique_path();  // unique name in case tests running in parallel
  path unique_yy = unique_dir / "yy";
  path unique_yya = unique_dir / "yya";
  path unique_yy_zz = unique_dir / "yy" / "zz";

  fs::remove_all(unique_dir);  // make sure slate is blank
  BOOST_TEST(!fs::exists(unique_dir)); // reality check

  BOOST_TEST(fs::create_directories(unique_dir));
  BOOST_TEST(fs::exists(unique_dir));
  BOOST_TEST(fs::is_directory(unique_dir));

  BOOST_TEST(fs::create_directories(unique_yy_zz));
  BOOST_TEST(fs::exists(unique_dir));
  BOOST_TEST(fs::exists(unique_yy));
  BOOST_TEST(fs::exists(unique_yy_zz));
  BOOST_TEST(fs::is_directory(unique_dir));
  BOOST_TEST(fs::is_directory(unique_yy));
  BOOST_TEST(fs::is_directory(unique_yy_zz));

  path is_a_file(unique_dir / "uu");
  {
    std::ofstream f(is_a_file.string().c_str());
    BOOST_TEST(!!f);
  }
  BOOST_TEST(throws_fs_error(
    boost::bind(fs::create_directories, is_a_file)));
  BOOST_TEST(throws_fs_error(
    boost::bind(fs::create_directories, is_a_file / "aa")));

// recursive_directory_iterator tests ----------------------------------------//

  sys::error_code ec;
  fs::recursive_directory_iterator it("/no-such-path", ec);
  BOOST_TEST(ec);

  BOOST_TEST(throws_fs_error(
    boost::bind(create_recursive_iterator, "/no-such-path")));

  fs::remove(unique_dir / "uu");

#ifdef BOOST_WINDOWS_API
  // These tests depends on ordering of directory entries, and that's guaranteed
  // on Windows but not necessarily on other operating systems
  {
    std::ofstream f(unique_yya.string().c_str());
    BOOST_TEST(!!f);
  }

  for (it = fs::recursive_directory_iterator(unique_dir);
        it != fs::recursive_directory_iterator(); ++it)
    { std::cout << it->path() << '\n'; }

  it = fs::recursive_directory_iterator(unique_dir);
  BOOST_TEST(it->path() == unique_yy);
  BOOST_TEST(it.level() == 0);
  ++it;
  BOOST_TEST(it->path() == unique_yy_zz);
  BOOST_TEST(it.level() == 1);
  it.pop();
  BOOST_TEST(it->path() == unique_yya);
  BOOST_TEST(it.level() == 0);
  it++;
  BOOST_TEST(it == fs::recursive_directory_iterator());

  it = fs::recursive_directory_iterator(unique_dir);
  BOOST_TEST(it->path() == unique_yy);
  it.no_push();
  ++it;
  BOOST_TEST(it->path() == unique_yya);
  ++it;
  BOOST_TEST(it == fs::recursive_directory_iterator());

  fs::remove(unique_yya);
#endif

  it = fs::recursive_directory_iterator(unique_yy_zz);
  BOOST_TEST(it == fs::recursive_directory_iterator());
  
  it = fs::recursive_directory_iterator(unique_dir);
  BOOST_TEST(it->path() == unique_yy);
  BOOST_TEST(it.level() == 0);
  ++it;
  BOOST_TEST(it->path() == unique_yy_zz);
  BOOST_TEST(it.level() == 1);
  it++;
  BOOST_TEST(it == fs::recursive_directory_iterator());

  it = fs::recursive_directory_iterator(unique_dir);
  BOOST_TEST(it->path() == unique_yy);
  it.no_push();
  ++it;
  BOOST_TEST(it == fs::recursive_directory_iterator());

  it = fs::recursive_directory_iterator(unique_dir);
  BOOST_TEST(it->path() == unique_yy);
  ++it;
  it.pop();
  BOOST_TEST(it == fs::recursive_directory_iterator());

  ec.clear();
  BOOST_TEST(!ec);
  // check that two argument failed constructor creates the end iterator 
  BOOST_TEST(fs::recursive_directory_iterator("nosuchdir", ec)
    == fs::recursive_directory_iterator());
  BOOST_TEST(ec);

  fs::remove_all(unique_dir);  // clean up behind ourselves

  return ::boost::report_errors();
}
