//  Copyright (c) 2001-2010 Hartmut Kaiser
//  Copyright (c) 2001-2010 Joel de Guzman
// 
//  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)

#define BOOST_SPIRIT_KARMA_DEBUG

#include <boost/detail/lightweight_test.hpp>
#include <boost/spirit/include/karma_operator.hpp>
#include <boost/spirit/include/karma_char.hpp>
#include <boost/spirit/include/karma_string.hpp>
#include <boost/spirit/include/karma_numeric.hpp>
#include <boost/spirit/include/karma_auxiliary.hpp>
#include <boost/spirit/include/karma_nonterminal.hpp>
#include <boost/spirit/include/karma_action.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/phoenix_statement.hpp>
#include <boost/fusion/include/std_pair.hpp>

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

int main()
{
    using spirit_test::test;
    using spirit_test::test_delimited;

    using namespace boost::spirit::ascii;
    using namespace boost::spirit::karma::labels;
    using boost::spirit::karma::locals;
    using boost::spirit::karma::rule;
    using boost::spirit::karma::char_;
    using boost::spirit::karma::debug;
    using boost::spirit::karma::space;
    using boost::spirit::karma::eps;

    namespace phx = boost::phoenix;

    typedef spirit_test::output_iterator<char>::type outiter_type;

    { // basic tests
        rule<outiter_type, char()> a, b, c;
        rule<outiter_type, std::vector<char>()> start;

        std::vector<char> v;
        v.push_back('a');
        v.push_back('b');
        v.push_back('a');
        v.push_back('c');
        v.push_back('a');
        v.push_back('b');
        v.push_back('b');
        v.push_back('a');

        a = char_('a');
        b = char_('b');
        c = char_('c');
        BOOST_SPIRIT_DEBUG_NODE(a);
        BOOST_SPIRIT_DEBUG_NODE(b);
        BOOST_SPIRIT_DEBUG_NODE(c);

        start = *(a | b | c);
        BOOST_SPIRIT_DEBUG_NODE(start);
        BOOST_TEST(test("abacabba", start, v));

        // ignore the delimiter
        BOOST_TEST(test_delimited("abacabba ", start, v, space));

        std::vector<char> v1;
        v1.push_back('b');
        v1.push_back('c');

        start = (a | b) << c;
        BOOST_SPIRIT_DEBUG_NODE(start);
        BOOST_TEST(test("bc", start, v1));
    }

    { // tests with locals
        rule<outiter_type, char()> a, b, c;
        rule<outiter_type, std::vector<char>(), locals<int, double> > start;

        std::vector<char> v;
        v.push_back('a');
        v.push_back('b');
        v.push_back('a');
        v.push_back('c');
        v.push_back('a');
        v.push_back('b');
        v.push_back('b');
        v.push_back('a');

        a = char_('a');
        b = char_('b');
        c = char_('c');
        BOOST_SPIRIT_DEBUG_NODE(a);
        BOOST_SPIRIT_DEBUG_NODE(b);
        BOOST_SPIRIT_DEBUG_NODE(c);

        start %= eps[_a = 0, _b = 2.0] << *(a[++_a] | b | c);
        BOOST_SPIRIT_DEBUG_NODE(start);
        BOOST_TEST(test("abacabba", start, v));
    }

    return boost::report_errors();
}

