/* Copyright (c) 2003-2004 CrystalClear Software, Inc.
 * Use, modification and distribution is subject to the
 * Boost Software License, Version 1.0. (See accompanying
 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 * Author: Bart Garst
 * $Date: 2008-11-26 16:07:14 -0500 (Wed, 26 Nov 2008) $
 */
#include <iostream>
#include <sstream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include "../testfrmwk.hpp"
#include <boost/lexical_cast.hpp>

using namespace boost::gregorian;
using namespace boost::posix_time;
using boost::lexical_cast;

int main(){
#if defined(BOOST_NO_STD_WSTRING) || \
    defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
  check("No wstring/wstream support for this compiler", false);
#else
  
  std::wstring res, ws;
  std::wstringstream wss;
  /* time_period was used because all the time-type objects
   * that have operator<< can be easily accessed from it.
   * Tose are: ptime, time_duration, time_period */
  date d1(2003,Jan,20), d2(2003,May,10);
  time_period tp(ptime(d1,hours(1)), ptime(d2,hours(15)));

  // ptime
  wss << tp.begin(); 
  res = L"2003-Jan-20 01:00:00";
  check("ptime op<<", res == wss.str());
  wss.str(L"");
  ws = to_simple_wstring(tp.begin());
  check("ptime to_simple_wstring", res == ws);
  res = L"20030120T010000";
  ws = to_iso_wstring(tp.begin());
  check("ptime to_iso_wstring", res == ws);
  res = L"2003-01-20T01:00:00";
  ws = to_iso_extended_wstring(tp.begin());
  check("ptime to_iso_extended_wstring", res == ws);
  
  // time_duration
  wss << tp.length(); 
  res = L"2654:00:00";
  check("time_duration", res == wss.str());
  wss.str(L"");
  ws = to_simple_wstring(tp.length());
  check("time_duration to_simple_wstring", res == ws);
  res = L"26540000";
  ws = to_iso_wstring(tp.length());
  check("time_duration to_iso_wstring", res == ws);

  // time_period
  wss << tp;
#ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
  res = L"[2003-Jan-20 01:00:00/2003-May-10 14:59:59.999999999]";
#else
  res = L"[2003-Jan-20 01:00:00/2003-May-10 14:59:59.999999]";
#endif
  check("time_period", res == wss.str());
  wss.str(L"");
  ws = to_simple_wstring(tp);
  check("time_period to_simple_wstring", res == ws);

  // special values
  time_duration sv_td(neg_infin);
  date sv_d(pos_infin);
  ptime sv_tp(sv_d,hours(1));
  res = L"+infinity";
  wss << sv_tp;
  check("ptime op<< special value", res == wss.str());
  wss.str(L"");
  ws = to_simple_wstring(sv_tp);
  check("ptime to_simple_wstring special value", res == ws);
  res = L"-infinity";
  wss << sv_td;
  check("time_duration op<< special value", res == wss.str());
  wss.str(L"");
  ws = to_simple_wstring(sv_td);
  check("time_duration to_simple_wstring special value", res == ws);
  
#endif
  return printTestStats();
}
