// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
//
// 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 http://www.boost.org/lib/optional for documentation.
//
// You are welcome to contact the author at:
//  fernando_cacciola@hotmail.com
//
#include<stdexcept>
#include<string>
#include<sstream>

#define BOOST_ENABLE_ASSERT_HANDLER

#include "boost/optional/optional.hpp"
#include "boost/optional/optional_io.hpp"
#include "boost/none.hpp"

#include "boost/test/minimal.hpp"

#ifdef ENABLE_TRACE
#define TRACE(msg) std::cout << msg << std::endl ;
#else
#define TRACE(msg)
#endif

namespace boost {

void assertion_failed (char const * expr, char const * func, char const * file, long )
{
  using std::string ;
  string msg =  string("Boost assertion failure for \"")
               + string(expr)
               + string("\" at file \"")
               + string(file)
               + string("\" function \"")
               + string(func)
               + string("\"") ;

  TRACE(msg);

  throw std::logic_error(msg);
}

}

using namespace std ;
using namespace boost ;

template<class Opt>
void test2( Opt o, Opt buff )
{
  stringstream s ;

  s << o ;
  s >> buff ;

  BOOST_ASSERT( buff == o ) ;
}


template<class T>
void test( T v, T w )
{
  test2( make_optional(v), optional<T>  ());
  test2( make_optional(v), make_optional(w));
  test2( optional<T>  () , optional<T>  ());
  test2( optional<T>  () , make_optional(w));
}

int test_main( int, char* [] )
{
  try
  {
    test(1,2);
    test(string("hello"),string("buffer"));
    test(string(""),string("buffer"));
  }
  catch ( ... )
  {
    BOOST_ERROR("Unexpected Exception caught!");
  }

  return 0;
}

