//  Copyright (c) 2001-2010 Hartmut Kaiser
// 
//  Distributed under 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)

#include <boost/config/warning_disable.hpp>
#include <boost/detail/lightweight_test.hpp>

#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/spirit/include/phoenix.hpp>

#include <iostream>
#include "test.hpp"

using namespace spirit_test;

int main()
{
    using boost::spirit::karma::_1;
    using boost::spirit::karma::_a;
    using boost::spirit::karma::double_;
    using boost::spirit::karma::int_;
    using boost::spirit::karma::omit;
    using boost::spirit::karma::skip;
    using boost::spirit::karma::rule;
    using boost::spirit::karma::locals;

    typedef spirit_test::output_iterator<char>::type outiter_type;
    typedef std::pair<std::vector<int>, int> attribute_type;

    rule<outiter_type, attribute_type(), locals<int> > r;

    attribute_type a;
    a.first.push_back(0x01);
    a.first.push_back(0x02);
    a.first.push_back(0x04);
    a.first.push_back(0x08);
    a.second = 0;

    // omit[] is supposed to execute the embedded generator
    {
        std::pair<double, double> p (1.0, 2.0);
        BOOST_TEST(test("2.0", omit[double_] << double_, p));

        r %= omit[ *(int_[_a = _a + _1]) ] << int_[_1 = _a];
        BOOST_TEST(test("15", r, a));
    }

    // skip[] is not supposed to execute the embedded generator
    {
        using boost::spirit::karma::double_;
        using boost::spirit::karma::skip;

        std::pair<double, double> p (1.0, 2.0);
        BOOST_TEST(test("2.0", skip[double_] << double_, p));

        r %= skip[ *(int_[_a = _a + _1]) ] << int_[_1 = _a];
        BOOST_TEST(test("0", r, a));
    }
    
    return boost::report_errors();
}
