//  Copyright (c) 2001-2010 Hartmut Kaiser
//  Copyright (c) 2009 Carl Barron
// 
//  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/detail/lightweight_test.hpp>
#include <boost/spirit/include/lex_static_lexertl.hpp>

#include <iostream>
#include <string>
#include <vector>
#include <exception>

#include "matlib_static_switch.h"
#include "matlib.h"

void test_matrix(std::vector<std::vector<double> > const& x)
{
    BOOST_TEST(x.size() == 3);
    BOOST_TEST(x[0].size() == 2 && x[0][0] == 1 && x[0][1] == 2);
    BOOST_TEST(x[1].size() == 1 && x[1][0] == 3);
    BOOST_TEST(x[2].size() == 3 && x[2][0] == 4 && x[2][1] == 5 && x[2][2] == 6);
}

int main()
{
    std::string input("[[1,2][3][4,5,6]]");
    std::vector<std::vector<double> > results;

    typedef std::string::iterator iter;
    typedef boost::spirit::lex::lexertl::static_actor_lexer<
        boost::spirit::lex::lexertl::token<iter>,
        boost::spirit::lex::lexertl::static_::lexer_matlib_switch
    > lexer_type;

    typedef matlib_tokens<lexer_type> matlib_type;
    matlib_type matrix(results);
    iter first = input.begin();

    try {
        BOOST_TEST(boost::spirit::lex::tokenize(first, input.end(), matrix));
        test_matrix(results);
    }
    catch (std::runtime_error const& e) {
        std::cerr << e.what() << '\n';
        BOOST_TEST(false);
    }
    return boost::report_errors();
}
