//  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/fusion/include/struct.hpp>
#include <boost/fusion/include/nview.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_operator.hpp>
#include <boost/spirit/include/karma_nonterminal.hpp>
#include <boost/spirit/include/karma_auxiliary.hpp>

#include "test.hpp"

using namespace spirit_test;

///////////////////////////////////////////////////////////////////////////////
struct test_data
{
    std::string s1;
    std::string s2;
    int i1;
    double d1;
    std::string s3;
};

BOOST_FUSION_ADAPT_STRUCT(
    test_data,
    (int, i1)
    (std::string, s1)
    (std::string, s2)
    (std::string, s3)
    (double, d1)
)

///////////////////////////////////////////////////////////////////////////////
// this is just a test structure we need to use in place of an int
struct test_int_data1
{
    int i;
};

// so we provide a custom attribute transformation
namespace boost { namespace spirit { namespace traits
{
    template <>
    struct transform_attribute<test_int_data1 const, int, karma::domain>
    {
        typedef int type;
        static int pre(test_int_data1 const& d) { return d.i; }
    };
}}}

///////////////////////////////////////////////////////////////////////////////
// this is another test structure we need to use in place of an int, but this
// time we use a reference to the embedded element
struct test_int_data2
{
    int i;
};

// so we provide a custom attribute transformation
namespace boost { namespace spirit { namespace traits
{
    template <>
    struct transform_attribute<test_int_data2 const, int, karma::domain>
    {
        typedef int const& type;
        static int const& pre(test_int_data2 const& d) { return d.i; }
    };
}}}

///////////////////////////////////////////////////////////////////////////////
int main()
{
    namespace fusion = boost::fusion;
    namespace karma = boost::spirit::karma;

    test_data d1 = { "s11", "s12", 1, 2.5, "s13" };
    {

        BOOST_TEST(test("s121", 
            karma::string << karma::int_, 
            fusion::as_nview<2, 0>(d1)));

        BOOST_TEST(test_delimited("s12 1 ", 
            karma::string << karma::int_, 
            fusion::as_nview<2, 0>(d1), ' '));
    }

    {
        test_data d2 = { "s21", "s22", 2, 3.4, "s23" };
        typedef fusion::result_of::as_nview<test_data const, 1, 2, 4>::type 
            test_view;
        std::vector<test_data> v;
        v.push_back(d1);
        v.push_back(d2);

        karma::rule<output_iterator<char>::type, test_view()> r =
                karma::string << karma::string << karma::double_;

        BOOST_TEST(test("s11s122.5\ns21s223.4", r % karma::eol, v));
        BOOST_TEST(test_delimited("s11s122.5 \n s21s223.4 ", 
            r % karma::eol, v, ' '));
    }

    {
        test_int_data1 d = { 1 };
        BOOST_TEST(test("1", karma::attr_cast(karma::int_), d));
        BOOST_TEST(test("1", karma::attr_cast<test_int_data1>(karma::int_), d));
        BOOST_TEST(test("1", karma::attr_cast<test_int_data1, int>(karma::int_), d));
    }

    {
        test_int_data1 d[] = {{ 1 }, { 2 }};
        std::vector<test_int_data1> v;
        v.push_back(d[0]);
        v.push_back(d[1]);

        BOOST_TEST(test("1,2", karma::attr_cast(karma::int_) % ',', v));
        BOOST_TEST(test("1,2"
          , karma::attr_cast<test_int_data1>(karma::int_) % ',', v));
        BOOST_TEST(test("1,2"
          , karma::attr_cast<test_int_data1, int>(karma::int_) % ',', v));
    }

    {
        test_int_data1 d[] = {{ 1 }, { 2 }};
        std::vector<test_int_data1> v;
        v.push_back(d[0]);
        v.push_back(d[1]);

        karma::rule<output_iterator<char>::type, int()> r = karma::int_;
        BOOST_TEST(test("1,2", r % ',', v));
    }

    {
        test_int_data1 d[] = {{ 1 }, { 2 }};
        std::vector<test_int_data1> v;
        v.push_back(d[0]);
        v.push_back(d[1] );

// this won't compile as there is no defined transformation for
// test_int_data1 and double
//      BOOST_TEST(test("1.0,2.0", karma::attr_cast(karma::double_) % ',', v));
//      BOOST_TEST(test("1.0,2.0"
//        , karma::attr_cast<test_int_data1>(karma::double_) % ',', v));

        BOOST_TEST(test("1.0,2.0"
          , karma::attr_cast<test_int_data1, int>(karma::double_) % ',', v));

        karma::rule<output_iterator<char>::type, int()> r = karma::double_;
        BOOST_TEST(test("1.0,2.0", r % ',', v));
    }

    {
        test_int_data2 d = { 1 };
        BOOST_TEST(test("1", karma::attr_cast(karma::int_), d));
        BOOST_TEST(test("1", karma::attr_cast<test_int_data2>(karma::int_), d));
        BOOST_TEST(test("1", karma::attr_cast<test_int_data2, int>(karma::int_), d));
    }

    {
        test_int_data2 d[] = {{ 1 }, { 2 }};
        std::vector<test_int_data2> v;
        v.push_back(d[0]);
        v.push_back(d[1]);

        BOOST_TEST(test("1,2", karma::attr_cast(karma::int_) % ',', v));
        BOOST_TEST(test("1,2"
          , karma::attr_cast<test_int_data2>(karma::int_) % ',', v));
        BOOST_TEST(test("1,2"
          , karma::attr_cast<test_int_data2, int>(karma::int_) % ',', v));
    }

    {
        test_int_data2 d[] = {{ 1 }, { 2 }};
        std::vector<test_int_data2> v;
        v.push_back(d[0]);
        v.push_back(d[1]);

        karma::rule<output_iterator<char>::type, int()> r = karma::int_;
        BOOST_TEST(test("1,2", r % ',', v));
    }

    {
        test_int_data2 d[] = {{ 1 }, { 2 }};
        std::vector<test_int_data2> v;
        v.push_back(d[0]);
        v.push_back(d[1] );

// this won't compile as there is no defined transformation for
// test_int_data2 and double
//      BOOST_TEST(test("1.0,2.0", karma::attr_cast(karma::double_) % ',', v));
//      BOOST_TEST(test("1.0,2.0"
//        , karma::attr_cast<test_int_data2>(karma::double_) % ',', v));

        BOOST_TEST(test("1.0,2.0"
          , karma::attr_cast<test_int_data2, int>(karma::double_) % ',', v));

        karma::rule<output_iterator<char>::type, int()> r = karma::double_;
        BOOST_TEST(test("1.0,2.0", r % ',', v));
    }

    return boost::report_errors();
}
