//  Copyright (c) 2010 Daniel James
//  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/qi.hpp>
#include <vector>

int main() 
{
    typedef char const* Iterator;
    namespace qi = boost::spirit::qi;

    qi::rule<Iterator, std::vector<boost::iterator_range<Iterator> >()> list;
    list = *qi::raw[qi::char_]; // This fails to compile
    
    char const* test = "abcdef";
    int test_length = 6;
    char const* test_begin = test;
    char const* test_end = test + test_length;
    std::vector<boost::iterator_range<Iterator> > result;
    bool r = qi::parse(test_begin, test_end, list, result);
    
    BOOST_TEST(r);
    BOOST_TEST(test_begin == test_end);
    BOOST_TEST(result.size() == test_length);

    for(int i = 0; i < test_length; ++i) {
        BOOST_TEST(result[i].begin() == test + i);
        BOOST_TEST(result[i].end() == test + i + 1);
    }

    return boost::report_errors();
}
