blob: a50a8f685fcdc5e695bbd0f192cfff6b8389ba5f [file] [log] [blame]
/*-----------------------------------------------------------------------------+
Copyright (c) 2008-2009: Joachim Faulhaber
+------------------------------------------------------------------------------+
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENCE.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------------------------------------*/
#define BOOST_TEST_MODULE icl::example_boost_party unit test
#include <libs/icl/test/disable_test_warnings.hpp>
#include "../unit_test_unwarned.hpp"
//#include <boost/icl/set.hpp> // Needed for implicit calls of operator << on
//JODO CLANG // GuestSets via test macros.
//------------------------------------------------------------------------------
// begin example code. return value added to function boost_party
//------------------------------------------------------------------------------
#include <boost/icl/ptime.hpp>
#include <iostream>
#include <boost/icl/interval_map.hpp>
using namespace std;
using namespace boost::posix_time;
using namespace boost::icl;
// Type set<string> collects the names of party guests. Since std::set is
// a model of the itl's set concept, the concept provides an operator +=
// that performs a set union on overlap of intervals.
typedef std::set<string> GuestSetT;
interval_map<ptime, GuestSetT> boost_party()
{
GuestSetT mary_harry;
mary_harry.insert("Mary");
mary_harry.insert("Harry");
GuestSetT diana_susan;
diana_susan.insert("Diana");
diana_susan.insert("Susan");
GuestSetT peter;
peter.insert("Peter");
// A party is an interval map that maps time intervals to sets of guests
interval_map<ptime, GuestSetT> party;
party.add( // add and element
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 19:30"),
time_from_string("2008-05-20 23:00")),
mary_harry));
party += // element addition can also be done via operator +=
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 20:10"),
time_from_string("2008-05-21 00:00")),
diana_susan);
party +=
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 22:15"),
time_from_string("2008-05-21 00:30")),
peter);
interval_map<ptime, GuestSetT>::iterator it = party.begin();
cout << "----- History of party guests -------------------------\n";
while(it != party.end())
{
interval<ptime>::type when = it->first;
// Who is at the party within the time interval 'when' ?
GuestSetT who = (*it++).second;
cout << when << ": " << who << endl;
}
return party;
}
//------------------------------------------------------------------------------
// end example code
//------------------------------------------------------------------------------
typedef interval_map<ptime, GuestSetT> PartyHistory;
typedef PartyHistory::segment_type SegmentT;
SegmentT episode(const char* from, const char* to, GuestSetT guests)
{
return make_pair( interval<ptime>
::right_open( time_from_string(from)
, time_from_string(to) )
, guests);
}
PartyHistory check_party()
{
GuestSetT mary_harry;
mary_harry.insert("Mary");
mary_harry.insert("Harry");
GuestSetT diana_susan;
diana_susan.insert("Diana");
diana_susan.insert("Susan");
GuestSetT peter;
peter.insert("Peter");
GuestSetT Diana_Harry_Mary_Susan = mary_harry + diana_susan;
GuestSetT Diana_Harry_Mary_Peter_Susan = Diana_Harry_Mary_Susan + peter;
GuestSetT Diana_Peter_Susan = Diana_Harry_Mary_Peter_Susan - mary_harry;
PartyHistory party;
party += episode("2008-05-20 19:30", "2008-05-20 20:10", mary_harry);
party += episode("2008-05-20 20:10", "2008-05-20 22:15", Diana_Harry_Mary_Susan);
party += episode("2008-05-20 22:15", "2008-05-20 23:00", Diana_Harry_Mary_Peter_Susan);
party += episode("2008-05-20 23:00", "2008-05-21 00:00", Diana_Peter_Susan);
party += episode("2008-05-21 00:00", "2008-05-21 00:30", peter);
return party;
}
BOOST_AUTO_TEST_CASE(icl_example_boost_party)
{
PartyHistory party1 = boost_party();
PartyHistory party2 = check_party();
bool party_equality = (party1==party2);
BOOST_CHECK(party_equality);
//BOOST_CHECK_EQUAL(boost_party(), check_party());
}