/*=============================================================================
    Copyright (c) 2001-2011 Joel de Guzman
    Copyright (c) 2001-2011 Hartmut Kaiser
    Copyright (c) 2011      Bryce Lelbach

    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 "int.hpp"

int
main()
{
    using spirit_test::test;
    using spirit_test::test_attr;

    ///////////////////////////////////////////////////////////////////////////
    //  signed integer literal tests
    ///////////////////////////////////////////////////////////////////////////
    {
        using boost::spirit::lit;
        int i = 123456;

        BOOST_TEST( test("123456", lit(123456)));
        BOOST_TEST(!test("123456", lit(0)));
        BOOST_TEST( test("123456", lit(i)));
        BOOST_TEST(!test("123456", lit(-i)));
        BOOST_TEST( test("+425", lit(425)));
        BOOST_TEST(!test("+425", lit(17)));
        BOOST_TEST( test("-2000", lit(-2000)));
        BOOST_TEST(!test("-2000", lit(2000)));
        BOOST_TEST( test(max_int, lit(INT_MAX)));
        BOOST_TEST(!test(max_int, lit(INT_MIN)));

        BOOST_TEST( test(min_int, lit(INT_MIN)));
        BOOST_TEST(!test(min_int, lit(INT_MAX)));

        BOOST_TEST(!test("-", lit(8451)));
        BOOST_TEST(!test("+", lit(8451)));

        // with leading zeros
        BOOST_TEST(test("000000000098765", lit(98765)));
    }

    ///////////////////////////////////////////////////////////////////////////
    //  long long literal tests
    ///////////////////////////////////////////////////////////////////////////
#ifdef BOOST_HAS_LONG_LONG
    {
        using boost::spirit::lit;
        boost::long_long_type ll = 1234567890123456789LL;

        BOOST_TEST( test("1234567890123456789", lit(1234567890123456789LL)));
        BOOST_TEST(!test("1234567890123456789", lit(-19LL)));
        BOOST_TEST( test("1234567890123456789", lit(ll)));
        BOOST_TEST(!test("1234567890123456789", lit(-ll)));
        BOOST_TEST( test("-100000000000000", lit(-100000000000000LL)));
        BOOST_TEST(!test("-100000000000000", lit(3243515525263LL)));
        BOOST_TEST( test(max_long_long, lit(LONG_LONG_MAX)));
        BOOST_TEST(!test(max_long_long, lit(LONG_LONG_MIN)));

        BOOST_TEST( test(min_long_long, lit(LONG_LONG_MIN)));
        BOOST_TEST(!test(min_long_long, lit(LONG_LONG_MAX)));
    }
#endif

    ///////////////////////////////////////////////////////////////////////////
    //  short_ and long_ literal tests
    ///////////////////////////////////////////////////////////////////////////
    {
        using boost::spirit::lit;
        short s = 12345;
        long l = 1234567890L;

        BOOST_TEST( test("12345",  lit(12345)));
        BOOST_TEST(!test("12345",  lit(-12345)));
        BOOST_TEST( test("12345",  lit(s)));
        BOOST_TEST(!test("12345",  lit(-s)));
        BOOST_TEST( test("-12345", lit(-12345)));
        BOOST_TEST(!test("-12345", lit(12345)));
        BOOST_TEST( test("-12345", lit(-s)));
        BOOST_TEST(!test("-12345", lit(s)));

        BOOST_TEST( test("1234567890",  lit(1234567890)));
        BOOST_TEST(!test("1234567890",  lit(-1234567890)));
        BOOST_TEST( test("1234567890",  lit(l)));
        BOOST_TEST(!test("1234567890",  lit(-l)));
        BOOST_TEST( test("-1234567890", lit(-1234567890)));
        BOOST_TEST(!test("-1234567890", lit(1234567890)));
        BOOST_TEST( test("-1234567890", lit(-l)));
        BOOST_TEST(!test("-1234567890", lit(l)));
    }
    
    ///////////////////////////////////////////////////////////////////////////
    //  literal lazy tests
    ///////////////////////////////////////////////////////////////////////////
    {
        using boost::phoenix::ref;
        using boost::spirit::qi::lit;
        int n = 123, m = 321;

        BOOST_TEST(test("123", lit(ref(n))));
        BOOST_TEST(!test("123", lit(ref(m))));
    }

    return boost::report_errors();
}
