/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package groovy

/**
 * Test numeric literal types (with and without suffixes)
 * @see org.codehaus.groovy.syntax.parser/ASTBuilder#createIntegralNumber()
 * @see org.codehaus.groovy.syntax.parser/ASTBuilder#createDecimalNumber()
 *
 * @author Brian Larson
 */
class LiteralTypesTest extends GroovyTestCase {

    void testIntegral() {
        def x = 42;
        assert x instanceof Integer;

        x = 42I;
        assert x instanceof Integer;

        x = 42i;
        assert x instanceof Integer;

        x = 42L;
        assert x instanceof Long;

        x = 42G;
        assert x instanceof BigInteger;

        x = 0xFF; //Hex
        assert x instanceof Integer;
        assert x == new Integer("255");

        x = 0xFFL; //Hex
        assert x instanceof Long;
        assert x == new Long("255");

        x = 0xFFG; //Hex
        assert x instanceof BigInteger;
        assert x == new BigInteger("FF",16);

        x = 0x9000000000000000;
        assert x instanceof BigInteger;
        assert x == new BigInteger("9000000000000000",16);

        x = 077; //octal
        assert x instanceof Integer;
        assert x == new Integer("63");

        x = 077l; //octal
        assert x instanceof Long;
        assert x == new Long("63");

        x = 077g; //octal
        assert x instanceof BigInteger;
        assert x == new BigInteger("77",8);

        x = 2147483647;           // max integer value
        assert x instanceof Integer;
        assert x == new Integer("2147483647");

        x = -2147483648;          // min integer constant
        assert x < 0
        assert x == new Integer("-2147483648");
        assert x instanceof Integer, x.class;

        x = -2147483649;          // min integer value - 1
        assert x == new Long("-2147483649");
        assert x instanceof Long;

        x = 2147483648;           // 1 + max integer value
        assert x == new Long("2147483648");
        assert x instanceof Long;

        x = 9223372036854775807;  // max long value
        assert x == new Long("9223372036854775807");
        assert x instanceof Long;

        x = -9223372036854775808; // min long value
        assert x == new Long("-9223372036854775808");
        assert x instanceof Long;

        x = -9223372036854775809; // min long value - 1
        assert x == new BigInteger("-9223372036854775809");
        assert x instanceof BigInteger;

        x = 9223372036854775808;  // 1 + max long value
        assert x == new BigInteger("9223372036854775808");
        assert x instanceof BigInteger;
    }

    void testDecimal() {
        def x = 3.2;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("3.2");

        x = 3.2G;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("3.2");

        x = 3.2g;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("3.2");

        x = -3.2;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("-3.2");

        x = 3.2D;
        assert x instanceof Double;
        assert x == new Double("3.2");

        x = -3.2d;
        assert x instanceof Double;
        assert x == new Double("-3.2");

        x = 3.2F;
        assert x instanceof Float;
        assert x == new Float("3.2");

        x = -3.2f;
        assert x instanceof Float;
        assert x == new Float("-3.2");
    }

    void testExponential() {
        def x = 3.1415926535e42;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("3.1415926535e42");

        x = 3.2e+2;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("3.2e+2");

        x = 3.2e-2;
        assert x instanceof BigDecimal;
        assert x == new BigDecimal("3.2e-2");

        x = 3.2e2d;
        assert x instanceof Double;
        assert x == new Double("3.2e2");

        x = 3.2e2f;
        assert x instanceof Float;
        assert x == new Float("3.2e2");
    }
}
