/**
 * Copyright (c) 2009, 2018 Obeo and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Obeo - initial API and implementation
 *     Axel Uhl (SAP AG) - Bug 342644
 */
package org.eclipse.ocl.tests;

import java.math.BigInteger;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.ocl.expressions.UnlimitedNaturalLiteralExp;
import org.eclipse.ocl.options.ParsingOptions;

//FIXME we're missing oclIsNew and oclIsInState
/**
 * This unit test focuses on the Standard library's Integer and Real operations.
 * The unlimited natural will be considered as conforming to Integer. This will
 * need revisting once bug 261008 is fixed.
 *
 * @author Laurent Goubet (lgoubet)
 */
@SuppressWarnings("nls")
public abstract class GenericEvaluationNumberOperationTest<E extends EObject, PK extends E, T extends E, C extends T, CLS extends C, DT extends C, PT extends C, ET extends DT, O extends E, PM extends E, P extends E, PA extends P, PR extends P, EL, S, COA, SSA, CT>
extends GenericEvaluationTestSuite<E, PK, T, C, CLS, DT, PT, ET, O, PM, P, PA, PR, EL, S, COA, SSA, CT> {

	public void testNumberAbs() {
		// Integer::abs()
		assertResult(Integer.valueOf(3), "3.abs()");
		assertResult(Integer.valueOf(3), "(-3).abs()");

		assertResult(2147483647, "2147483647.abs()");
		assertParserError("2147483648.abs()", "For input string: \"{0}\"", "2147483648");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		assertResult(2147483648L, "2147483648.abs()");
		assertResult(2147483649L, "(-2147483649).abs()");
		assertResult(2147483648L, "(-2147483648).abs()");

		// Real::abs()
		assertResult(Double.valueOf(3d), "(3.0).abs()");
		assertResult(Double.valueOf(3d), "(-3.0).abs()");
		assertResult(Double.valueOf(3.1758d), "(3.1758).abs()");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberAbsInvalid() {
		assertResultInvalid("let i : Integer = invalid in i.abs()");
		assertResultInvalid("let r : Real = invalid in r.abs()");
	}

	public void testNumberAbsNull() {
		assertResultInvalid("let i : Integer = null in i.abs()");
		assertResultInvalid("let r : Real = null in r.abs()");
	}

	public void testNumberDiv() {
		assertResult(Integer.valueOf(1), "3.div(2)");
		assertResult(Integer.valueOf(-1), "(-3).div(2)");
		assertResult(Integer.valueOf(-1), "3.div(-2)");
		assertResult(Integer.valueOf(1), "(-3).div(-2)");
	}

	public void testNumberDivByZero() {
		assertResultInvalid("1.div(0)");
	}

	public void testNumberDivide() {
		// A.2.1.3 Contrary to other operations, "Integer x Integer -> Real"
		// Integer::/(Integer)
		assertResult(Double.valueOf(1d), "1 / 1");
		assertResult(Double.valueOf(-0.25d), "1 / -4");

		// Integer::/(Real)
		assertResult(Double.valueOf(1d), "1 / 1.0");
		assertResult(Double.valueOf(-0.25d), "1 / -4.0");

		// Real::/(Integer)
		assertResult(Double.valueOf(1d), "1.0 / 1");
		assertResult(Double.valueOf(-0.25d), "1.0 / -4");

		// Real::/(Real)
		assertResult(Double.valueOf(1d), "1.0 / 1.0");
		assertResult(Double.valueOf(1.11d / 1.12d), "1.11 / 1.12");
	}

	public void testNumberDivideByZero() {
		assertResultInvalid("1 / 0");
		assertResultInvalid("1.0 / 0");
		assertResultInvalid("1 / 0.0");
		assertResultInvalid("1.0 / 0.0");
	}

	public void testNumberDivideInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1 / i");
		assertResultInvalid("let i : Integer = invalid in i / 1");
		assertResultInvalid("let r : Real = invalid in 1 / r");
		assertResultInvalid("let r : Real = invalid in r / 1");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 / i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 / r2");
	}

	public void testNumberDivideNull() {
		assertResultInvalid("let i : Integer = null in 1 / i");
		assertResultInvalid("let i : Integer = null in i / 1");
		assertResultInvalid("let r : Real = null in 1 / r");
		assertResultInvalid("let r : Real = null in r / 1");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 / i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 / r2");
	}

	public void testNumberDivInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1.div(i)");
		assertResultInvalid("let i : Integer = invalid in i.div(1)");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1.div(i2)");
	}

	public void testNumberDivNull() {
		assertResultInvalid("let i : Integer = null in 1.div(i)");
		assertResultInvalid("let i : Integer = null in i.div(1)");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1.div(i2)");
	}

	public void testNumberEqual() {
		assertResultFalse("4 = 5");
		assertResultFalse("1 = 4.0");
		assertResultFalse("1.0 = 4");
		assertResultFalse("1.0 = 4.0");

		assertResultTrue("4 = 4");
		assertResultTrue("1 = 1.0");
		assertResultTrue("1.0 = 1");
		assertResultTrue("1.0 = 1.0");
	}

	public void testNumberEqualInvalid() {
		// operation invocations on invalid except for oclIsInvalid and oclIsUndefined yield invalid
		assertResultInvalid("let i : Integer = invalid in i = 0");
		assertResultInvalid("let i : Integer = invalid in -1 = i");
		assertResultInvalid("let r : Real = invalid in r = 0.0");
		assertResultInvalid("let r : Real = invalid in -1.0 = r");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 = i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 = r2");
	}

	public void testNumberEqualNull() {
		assertResultFalse("let i : Integer = null in i = 0");
		assertResultFalse("let i : Integer = null in -1 = i");
		assertResultFalse("let r : Real = null in r = 0.0");
		assertResultFalse("let r : Real = null in -1.0 = r");

		assertResultTrue("let i1 : Integer = null, i2 : Integer = null in i1 = i2");
		assertResultTrue("let r1 : Real = null, r2 : Real = null in r1 = r2");
	}

	public void testNumberFloor() {
		// Integer::floor()
		assertResult(Integer.valueOf(3), "3.floor()");
		assertResult(Integer.valueOf(-3), "(-3).floor()");

		// Real::floor()
		assertResult(Integer.valueOf(-2), "(-1.5).floor()");
		assertResult(Integer.valueOf(1), "(1.01).floor()");
		assertResult(Integer.valueOf(3), "(3.999).floor()");
	}

	public void testNumberFloorInvalid() {
		assertResultInvalid("let i : Integer = invalid in i.floor()");
		assertResultInvalid("let r : Real = invalid in r.floor()");
	}

	public void testNumberFloorNull() {
		assertResultInvalid("let i : Integer = null in i.floor()");
		assertResultInvalid("let r : Real = null in r.floor()");
	}

	public void testNumberGreaterThan() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::greaterThan(Integer)
		assertResultTrue("3 > 2");
		assertResultFalse("-3 > 2");
		assertResultTrue("3 > -2");
		assertResultFalse("-3 > -2");

		assertQueryTrue(null, "2147483648 > 2147483647");
		assertQueryFalse(null, "2147483647 > 2147483648");
		assertQueryFalse(null, "-2147483649 > -2147483648");
		assertQueryTrue(null, "-2147483648 > -2147483649");

		assertQueryTrue(null, "2147483648 >= 2147483647");
		assertQueryFalse(null, "2147483647 >= 2147483648");
		assertQueryFalse(null, "-2147483649 >= -2147483648");
		assertQueryTrue(null, "-2147483648 >= -2147483649");

		// Real::greaterThan(Real)
		assertResultTrue("3.0 > 2.0");
		assertResultFalse("-3.0 > 2.0");
		assertResultTrue("3.0 > -2.0");
		assertResultFalse("-3.0 > -2.0");

		// Real::greaterThan(Integer)
		assertResultFalse("3.0 > 3");
		assertResultFalse("-3.0 > 3");
		assertResultTrue("3.0 > -3");
		assertResultFalse("-3.0 > -3");

		// Integer::greaterThan(Real)
		assertResultFalse("3 > 3.0");
		assertResultFalse("-3 > 3.0");
		assertResultTrue("3 > -3.0");
		assertResultFalse("-3 > -3.0");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberGreaterThanInvalid() {
		assertResultInvalid("let i : Integer = invalid in i > 0");
		assertResultInvalid("let i : Integer = invalid in 0 > i");
		assertResultInvalid("let r : Real = invalid in r > 0");
		assertResultInvalid("let r : Real = invalid in 0 > r");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 > i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 > r2");
	}

	public void testNumberGreaterThanNull() {
		assertResultInvalid("let i : Integer = null in i > 0");
		assertResultInvalid("let i : Integer = null in 0 > i");
		assertResultInvalid("let r : Real = null in r > 0");
		assertResultInvalid("let r : Real = null in 0 > r");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 > i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 > r2");
	}

	public void testNumberGreaterThanOrEqual() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::greaterThanOrEqual(Integer)
		assertResultTrue("3 >= 2");
		assertResultFalse("-3 >= 2");
		assertResultTrue("3 >= -2");
		assertResultFalse("-3 >= -2");

		assertQueryTrue(null, "2147483648 >= 2147483647");
		assertQueryFalse(null, "2147483647 >= 2147483648");
		assertQueryFalse(null, "-2147483649 >= -2147483648");
		assertQueryTrue(null, "-2147483648 >= -2147483649");

		// Real::greaterThanOrEqual(Real)
		assertResultTrue("3.0 >= 2.0");
		assertResultFalse("-3.0 >= 2.0");
		assertResultTrue("3.0 >= -2.0");
		assertResultFalse("-3.0 >= -2.0");

		// Real::greaterThanOrEqual(Integer)
		assertResultTrue("3.0 >= 3");
		assertResultFalse("-3.0 >= 3");
		assertResultTrue("3.0 >= -3");
		assertResultTrue("-3.0 >= -3");

		// Integer::greaterThanOrEqual(Real)
		assertResultTrue("3 >= 3.0");
		assertResultFalse("-3 >= 3.0");
		assertResultTrue("3 >= -3.0");
		assertResultTrue("-3 >= -3.0");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
	}

	public void testNumberGreaterThanOrEqualInvalid() {
		assertResultInvalid("let i : Integer = invalid in i >= 0");
		assertResultInvalid("let i : Integer = invalid in 0 >= i");
		assertResultInvalid("let r : Real = invalid in r >= 0");
		assertResultInvalid("let r : Real = invalid in 0 >= r");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 >= i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 >= r2");
	}

	public void testNumberGreaterThanOrEqualNull() {
		assertResultInvalid("let i : Integer = null in i >= 0");
		assertResultInvalid("let i : Integer = null in 0 >= i");
		assertResultInvalid("let r : Real = null in r >= 0");
		assertResultInvalid("let r : Real = null in 0 >= r");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 >= i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 >= r2");
	}

	public void testNumberLessThan() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::lessThan(Integer)
		assertResultFalse("3 < 2");
		assertResultTrue("-3 < 2");
		assertResultFalse("3 < -2");
		assertResultTrue("-3 < -2");

		assertQueryFalse(null, "2147483648 < 2147483647");
		assertQueryTrue(null, "2147483647 < 2147483648");
		assertQueryTrue(null, "-2147483649 < -2147483648");
		assertQueryFalse(null, "-2147483648 < -2147483649");

		// Real::lessThan(Real)
		assertResultFalse("3.0 < 2.0");
		assertResultTrue("-3.0 < 2.0");
		assertResultFalse("3.0 < -2.0");
		assertResultTrue("-3.0 < -2.0");

		// Real::lessThan(Integer)
		assertResultFalse("3.0 < 3");
		assertResultTrue("-3.0 < 3");
		assertResultFalse("3.0 < -3");
		assertResultFalse("-3.0 < -3");

		// Integer::lessThan(Real)
		assertResultFalse("3 < 3.0");
		assertResultTrue("-3 < 3.0");
		assertResultFalse("3 < -3.0");
		assertResultFalse("-3 < -3.0");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberLessThanInvalid() {
		assertResultInvalid("let i : Integer = invalid in i < 0");
		assertResultInvalid("let i : Integer = invalid in 0 < i");
		assertResultInvalid("let r : Real = invalid in r < 0");
		assertResultInvalid("let r : Real = invalid in 0 < r");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 < i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 < r2");
	}

	public void testNumberLessThanNull() {
		assertResultInvalid("let i : Integer = null in i < 0");
		assertResultInvalid("let i : Integer = null in 0 < i");
		assertResultInvalid("let r : Real = null in r < 0");
		assertResultInvalid("let r : Real = null in 0 < r");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 < i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 < r2");
	}

	public void testNumberLessThanOrEqual() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::lessThanOrEqual(Integer)
		assertResultFalse("3 <= 2");
		assertResultTrue("-3 <= 2");
		assertResultFalse("3 <= -2");
		assertResultTrue("-3 <= -2");

		assertQueryFalse(null, "2147483648 <= 2147483647");
		assertQueryTrue(null, "2147483647 <= 2147483648");
		assertQueryTrue(null, "-2147483649 <= -2147483648");
		assertQueryFalse(null, "-2147483648 <= -2147483649");

		// Real::lessThanOrEqual(Real)
		assertResultFalse("3.0 <= 2.0");
		assertResultTrue("-3.0 <= 2.0");
		assertResultFalse("3.0 <= -2.0");
		assertResultTrue("-3.0 <= -2.0");

		// Real::lessThanOrEqual(Integer)
		assertResultTrue("3.0 <= 3");
		assertResultTrue("-3.0 <= 3");
		assertResultFalse("3.0 <= -3");
		assertResultTrue("-3.0 <= -3");

		// Integer::lessThanOrEqual(Real)
		assertResultTrue("3 <= 3.0");
		assertResultTrue("-3 <= 3.0");
		assertResultFalse("3 <= -3.0");
		assertResultTrue("-3 <= -3.0");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberLessThanOrEqualInvalid() {
		assertResultInvalid("let i : Integer = invalid in i <= 0");
		assertResultInvalid("let i : Integer = invalid in 0 <= i");
		assertResultInvalid("let r : Real = invalid in r <= 0");
		assertResultInvalid("let r : Real = invalid in 0 <= r");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 <= i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 <= r2");
	}

	public void testNumberLessThanOrEqualNull() {
		assertResultInvalid("let i : Integer = null in i <= 0");
		assertResultInvalid("let i : Integer = null in 0 <= i");
		assertResultInvalid("let r : Real = null in r <= 0");
		assertResultInvalid("let r : Real = null in 0 <= r");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 <= i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 <= r2");
	}

	public void testNumberMax() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::max(Integer)
		assertResult(Integer.valueOf(3), "3.max(2)");
		assertResult(Integer.valueOf(2), "(-3).max(2)");
		assertResult(Integer.valueOf(3), "3.max(-2)");
		assertResult(Integer.valueOf(-2), "(-3).max(-2)");

		assertResult(2147483648L, "2147483648.max(2147483647)");
		assertResult(2147483648L, "2147483647.max(2147483648)");
		assertResult(-2147483648, "(-2147483649).max(-2147483648)");
		assertResult(-2147483648, "(-2147483648).max(-2147483649)");

		// Integer::max(Real)
		assertResult(Double.valueOf(3d), "3.max(2.0)");
		assertResult(Double.valueOf(2d), "(-3).max(2.0)");
		assertResult(Double.valueOf(3d), "3.max(-2.0)");
		assertResult(Double.valueOf(-2d), "(-3).max(-2.0)");

		// Real::max(Integer)
		assertResult(Double.valueOf(3d), "(3.0).max(2)");
		assertResult(Double.valueOf(2d), "(-3.0).max(2)");
		assertResult(Double.valueOf(3d), "(3.0).max(-2)");
		assertResult(Double.valueOf(-2d), "(-3.0).max(-2)");

		// Real::max(Real)
		assertResult(Double.valueOf(3d), "(3.0).max(2.0)");
		assertResult(Double.valueOf(2d), "(-3.0).max(2.0)");
		assertResult(Double.valueOf(3d), "(3.0).max(-2.0)");
		assertResult(Double.valueOf(-2d), "(-3.0).max(-2.0)");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberMaxInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1.max(i)");
		assertResultInvalid("let i : Integer = invalid in i.max(1)");
		assertResultInvalid("let r : Real = invalid in 1.max(r)");
		assertResultInvalid("let r : Real = invalid in r.max(1)");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1.max(i2)");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1.max(r2)");
	}

	public void testNumberMaxNull() {
		assertResultInvalid("let i : Integer = null in 1.max(i)");
		assertResultInvalid("let i : Integer = null in i.max(1)");
		assertResultInvalid("let r : Real = null in 1.max(r)");
		assertResultInvalid("let r : Real = null in r.max(1)");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1.max(i2)");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1.max(r2)");
	}

	public void testNumberMin() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::min(Integer)
		assertResult(Integer.valueOf(2), "3.min(2)");
		assertResult(Integer.valueOf(-3), "(-3).min(2)");
		assertResult(Integer.valueOf(-2), "3.min(-2)");
		assertResult(Integer.valueOf(-3), "(-3).min(-2)");

		assertResult(2147483647, "2147483648.min(2147483647)");
		assertResult(2147483647, "2147483647.min(2147483648)");
		assertResult(-2147483649L, "(-2147483649).min(-2147483648)");
		assertResult(-2147483649L, "(-2147483648).min(-2147483649)");

		// Integer::min(Real)
		assertResult(Double.valueOf(2d), "3.min(2.0)");
		assertResult(Double.valueOf(-3d), "(-3).min(2.0)");
		assertResult(Double.valueOf(-2d), "3.min(-2.0)");
		assertResult(Double.valueOf(-3d), "(-3).min(-2.0)");

		// Real::min(Integer)
		assertResult(Double.valueOf(2d), "(3.0).min(2)");
		assertResult(Double.valueOf(-3d), "(-3.0).min(2)");
		assertResult(Double.valueOf(-2d), "(3.0).min(-2)");
		assertResult(Double.valueOf(-3d), "(-3.0).min(-2)");

		// Real::min(Real)
		assertResult(Double.valueOf(2d), "(3.0).min(2.0)");
		assertResult(Double.valueOf(-3d), "(-3.0).min(2.0)");
		assertResult(Double.valueOf(-2d), "(3.0).min(-2.0)");
		assertResult(Double.valueOf(-3d), "(-3.0).min(-2.0)");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberMinInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1.min(i)");
		assertResultInvalid("let i : Integer = invalid in i.min(1)");
		assertResultInvalid("let r : Real = invalid in 1.min(r)");
		assertResultInvalid("let r : Real = invalid in r.min(1)");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1.min(i2)");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1.min(r2)");
	}

	public void testNumberMinNull() {
		assertResultInvalid("let i : Integer = null in 1.min(i)");
		assertResultInvalid("let i : Integer = null in i.min(1)");
		assertResultInvalid("let r : Real = null in 1.min(r)");
		assertResultInvalid("let r : Real = null in r.min(1)");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1.min(i2)");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1.min(r2)");
	}

	public void testNumberMinus() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::-(Integer)
		assertResult(Integer.valueOf(0), "1 - 1");
		assertResult(Integer.valueOf(5), "1 - -4");

		assertResult(BigInteger.ONE.shiftLeft(31).subtract(BigInteger.ONE).intValue(), "2147483646 - -1");
		assertResult(BigInteger.ONE.shiftLeft(31).longValue(), "2147483647 - -1");
		assertResult(BigInteger.ONE.shiftLeft(63).subtract(BigInteger.ONE).longValue(), "9223372036854775806 - -1");
		assertResult(BigInteger.ONE.shiftLeft(63).longValue(), "9223372036854775807 - -1");

		assertResult(BigInteger.ONE.negate().shiftLeft(31).intValue(), "-2147483647 - 1");
		assertResult(BigInteger.ONE.negate().shiftLeft(31).subtract(BigInteger.ONE).longValue(), "-2147483648 - 1");
		assertResult(BigInteger.ONE.shiftLeft(63).negate().longValue(), "-9223372036854775807 - 1");

		// Integer::-(Real)
		assertResult(Double.valueOf(0d), "1 - 1.0");
		assertResult(Double.valueOf(5d), "1 - -4.0");

		// Real::-(Integer)
		assertResult(Double.valueOf(0d), "1.0 - 1");
		assertResult(Double.valueOf(5d), "1.0 - -4");

		// Real::-(Real)
		assertResult(Double.valueOf(0d), "1.0 - 1.0");
		assertResult(Double.valueOf(-0.01d), "1.11 - 1.12");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberMinusInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1 - i");
		assertResultInvalid("let i : Integer = invalid in i - 1");
		assertResultInvalid("let r : Real = invalid in 1 - r");
		assertResultInvalid("let r : Real = invalid in r - 1");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 - i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 - r2");
	}

	public void testNumberMinusNull() {
		assertResultInvalid("let i : Integer = null in 1 - i");
		assertResultInvalid("let i : Integer = null in i - 1");
		assertResultInvalid("let r : Real = null in 1 - r");
		assertResultInvalid("let r : Real = null in r - 1");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 - i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 - r2");
	}

	public void testNumberMod() {
		assertResult(Integer.valueOf(1), "3.mod(2)");
		assertResult(Integer.valueOf(-1), "(-3).mod(2)");
		assertResult(Integer.valueOf(1), "3.mod(-2)");
		assertResult(Integer.valueOf(-1), "(-3).mod(-2)");
	}

	public void testNumberModInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1.mod(i)");
		assertResultInvalid("let i : Integer = invalid in i.mod(1)");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1.mod(i2)");
	}

	public void testNumberModNull() {
		assertResultInvalid("let i : Integer = null in 1.mod(i)");
		assertResultInvalid("let i : Integer = null in i.mod(1)");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1.mod(i2)");
	}

	public void testNumberNegate() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		assertResult(-1, "-1");
		assertResult(-1.0, "-1.0");

		assertResult(-2147483647, "-2147483647");
		assertResult(-2147483648, "-2147483648");
		assertResult(2147483648L, "-(-2147483648)");
		assertResult(-2147483649L, "-2147483649");
		// invalid
		assertResultInvalid("let i : Integer = invalid in -i");
		assertResultInvalid("let r : Real = invalid in -r");
		// null
		assertResultInvalid("let i : Integer = null in -i");
		assertResultInvalid("let r : Real = null in -r");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberNotEqual() {
		assertResultTrue("4 <> 5");
		assertResultTrue("1 <> 4.0");
		assertResultTrue("1.0 <> 4");
		assertResultTrue("1.0 <> 4.0");

		assertResultFalse("4 <> 4");
		assertResultFalse("1 <> 1.0");
		assertResultFalse("1.0 <> 1");
		assertResultFalse("1.0 <> 1.0");
	}

	public void testNumberNotEqualInvalid() {
		assertResultInvalid("let i : Integer = invalid in i <> 0");
		assertResultInvalid("let i : Integer = invalid in -1 <> i");
		assertResultInvalid("let r : Real = invalid in r <> 0.0");
		assertResultInvalid("let r : Real = invalid in -1.0 <> r");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 <> i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 <> r2");
	}

	public void testNumberNotEqualNull() {
		assertResultTrue("let i : Integer = null in i <> 0");
		assertResultTrue("let i : Integer = null in -1 <> i");
		assertResultTrue("let r : Real = null in r <> 0.0");
		assertResultTrue("let r : Real = null in -1.0 <> r");

		assertResultFalse("let i1 : Integer = null, i2 : Integer = null in i1 <> i2");
		assertResultFalse("let r1 : Real = null, r2 : Real = null in r1 <> r2");
	}

	public void testNumberOclIsInvalid() {
		assertResultFalse("3.oclIsInvalid()");
		assertResultFalse("(3.0).oclIsInvalid()");
	}

	public void testNumberOclIsUndefined() {
		assertResultFalse("3.oclIsUndefined()");
		assertResultFalse("(3.0).oclIsUndefined()");
	}

	public void testNumberPlus() {
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, true);
		// Integer::+(Integer)
		assertResult(Integer.valueOf(2), "1 + 1");
		assertResult(Integer.valueOf(-3), "1 + -4");

		assertResult(BigInteger.ONE.shiftLeft(31).subtract(BigInteger.ONE).intValue(), "2147483646 + 1");
		assertResult(BigInteger.ONE.shiftLeft(31).longValue(), "2147483647 + 1");
		assertResult(BigInteger.ONE.shiftLeft(63).subtract(BigInteger.ONE).longValue(), "9223372036854775806 + 1");
		assertResult(BigInteger.ONE.shiftLeft(63).longValue(), "9223372036854775807 + 1");

		assertResult(BigInteger.ONE.negate().shiftLeft(31).intValue(), "-2147483647 + -1");
		assertResult(BigInteger.ONE.negate().shiftLeft(31).subtract(BigInteger.ONE).longValue(), "-2147483648 + -1");
		assertResult(BigInteger.ONE.negate().shiftLeft(63).longValue(), "-9223372036854775807 + -1");

		// Integer::+(Real)
		assertResult(Double.valueOf(2d), "1 + 1.0");
		assertResult(Double.valueOf(-3d), "1 + -4.0");

		// Real::+(Integer)
		assertResult(Double.valueOf(2d), "1.0 + 1");
		assertResult(Double.valueOf(-3d), "1.0 + -4");

		// Real::+(Real)
		assertResult(Double.valueOf(2d), "1.0 + 1.0");
		assertResult(Double.valueOf(2.23d), "1.11 + 1.12");
		ParsingOptions.setOption(helper.getOCL().getEnvironment(), ParsingOptions.USE_LONG_INTEGERS, false);
	}

	public void testNumberPlusInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1 + i");
		assertResultInvalid("let i : Integer = invalid in i + 1");
		assertResultInvalid("let r : Real = invalid in 1 + r");
		assertResultInvalid("let r : Real = invalid in r + 1");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 + i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 + r2");
	}

	public void testNumberPlusNull() {
		assertResultInvalid("let i : Integer = null in 1 + i");
		assertResultInvalid("let i : Integer = null in i + 1");
		assertResultInvalid("let r : Real = null in 1 + r");
		assertResultInvalid("let r : Real = null in r + 1");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 + i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 + r2");
	}

	public void testNumberRound() {
		// Integer::round()
		assertResult(Integer.valueOf(3), "3.round()");
		assertResult(Integer.valueOf(-3), "(-3).round()");

		// Real::round()
		assertResult(Integer.valueOf(-1), "(-1.5).round()");
		assertResult(Integer.valueOf(1), "(1.01).round()");
		assertResult(Integer.valueOf(4), "(3.999).round()");
	}

	public void testNumberRoundInvalid() {
		assertResultInvalid("let i : Integer = invalid in i.round()");
		assertResultInvalid("let r : Real = invalid in r.round()");
	}

	public void testNumberRoundNull() {
		assertResultInvalid("let i : Integer = null in i.round()");
		assertResultInvalid("let r : Real = null in r.round()");
	}

	public void testNumberTimes() {
		// Integer::*(Integer)
		assertResult(Integer.valueOf(1), "1 * 1");
		assertResult(Integer.valueOf(-4), "1 * -4");

		// Integer::*(Real)
		assertResult(Double.valueOf(1d), "1 * 1.0");
		assertResult(Double.valueOf(-4d), "1 * -4.0");

		// Real::*(Integer)
		assertResult(Double.valueOf(1d), "1.0 * 1");
		assertResult(Double.valueOf(-4d), "1.0 * -4");

		// Real::*(Real)
		assertResult(Double.valueOf(1d), "1.0 * 1.0");
		assertResult(Double.valueOf(1.11d * 1.12d), "1.11 * 1.12");
	}

	public void testNumberTimesInvalid() {
		assertResultInvalid("let i : Integer = invalid in 1 * i");
		assertResultInvalid("let i : Integer = invalid in i * 1");
		assertResultInvalid("let r : Real = invalid in 1 * r");
		assertResultInvalid("let r : Real = invalid in r * 1");

		assertResultInvalid("let i1 : Integer = invalid, i2 : Integer = invalid in i1 * i2");
		assertResultInvalid("let r1 : Real = invalid, r2 : Real = invalid in r1 * r2");
	}

	public void testNumberTimesNull() {
		assertResultInvalid("let i : Integer = null in 1 * i");
		assertResultInvalid("let i : Integer = null in i * 1");
		assertResultInvalid("let r : Real = null in 1 * r");
		assertResultInvalid("let r : Real = null in r * 1");

		assertResultInvalid("let i1 : Integer = null, i2 : Integer = null in i1 * i2");
		assertResultInvalid("let r1 : Real = null, r2 : Real = null in r1 * r2");
	}

	public void testNumberToString() {
		assertResult("1", "1.toString()");
		assertResult("3.0", "3.0.toString()");
		assertResult("4.0", "(1.0+3.0).toString()");
		assertResult("null", "null.toString()");
		assertResult("invalid", "invalid.toString()");
		assertResult("*", "*.toString()");
		assertResult("-1", "(-1).toString()");
	}

	public void testNumberUnaryMinus() {
		assertResult(Integer.valueOf(-1), "-1");
		assertResult(Double.valueOf(-1d), "-1.0");
	}

	public void testNumberUnaryMinusInvalid() {
		assertResultInvalid("let i : Integer = invalid in -i");
		assertResultInvalid("let r : Real = invalid in -r");
	}

	public void testNumberUnaryMinusNull() {
		assertResultInvalid("let i : Integer = null in -i");
		assertResultInvalid("let r : Real = null in -r");
	}

	public void testUnlimitedAbs() {
		assertResultInvalid("*.abs()");
	}

	public void testUnlimitedAbsInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.abs()");
	}

	public void testUnlimitedAbsNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u.abs()");
	}

	public void testUnlimitedDiv() {
		/*
		 * FIXME I'm expecting the UnlimitedNatural to conform to Integer, div
		 * and mod calls should then at least parse for them even though they
		 * return an invalid value.
		 */
		assertResultInvalid("1.div(*)");
		// FIXME UnlimitedNatural.div(Integer) currently not found; problem in analyzer?
		assertResultInvalid("*.div(1)");

		assertResultInvalid("*.div(*)");
	}

	public void testUnlimitedDivide() {
		assertResultInvalid("1 / *");
		assertResultInvalid("* / 1");

		assertResultInvalid("1.0 / *");
		assertResultInvalid("* / 1.0");

		assertResultInvalid("* / *");
	}

	public void testUnlimitedDivideByZero() {
		assertResultInvalid("* / 0");
		assertResultInvalid("* / 0.0");
	}

	public void testUnlimitedDivideInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in * / u");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u / *");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 / u2");
	}

	public void testUnlimitedDivideNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in * / u");
		assertResultInvalid("let u : UnlimitedNatural = null in u / *");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 / u2");
	}

	public void testUnlimitedDivInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in 1.div(u)");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.div(1)");
	}

	public void testUnlimitedDivNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in 1.div(u)");
		assertResultInvalid("let u : UnlimitedNatural = null in u.div(1)");
	}

	public void testUnlimitedEqual() {
		assertResultFalse("* = 1");
		assertResultFalse("1 = *");
		assertResultFalse("* = 1.0");
		assertResultFalse("1.0 = *");
		// FIXME UNLIMIED is currently represented as -1, so no difference can be observed
		// assertResultFalse("* = -1");
		// assertResultFalse("-1 = *");
		// assertResultFalse("* = -1.0");
		// assertResultFalse("-1.0 = *");

		assertResultTrue("* = *");
	}

	public void testUnlimitedEqualInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u = *");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 = u2");
	}

	public void testUnlimitedEqualNull() {
		assertResultFalse("let u : UnlimitedNatural = null in u = *");

		assertResultTrue("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 = u2");
	}

	public void testUnlimitedFloor() {
		assertResultInvalid("*.floor()");
	}

	public void testUnlimitedFloorInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.floor()");
	}

	public void testUnlimitedFloorNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u.floor()");
	}

	public void testUnlimitedGreaterThan() {
		assertResultFalse("1 > *");
		assertResultTrue("* > 1");
		assertResultFalse("* > *");
	}

	public void testUnlimitedGreaterThanInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u > 0");
		assertResultInvalid("let u : UnlimitedNatural = invalid in 0 > u");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 > u2");
	}

	public void testUnlimitedGreaterThanNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u > 0");
		assertResultInvalid("let u : UnlimitedNatural = null in 0 > u");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 > u2");
	}

	public void testUnlimitedGreaterThanOrEqual() {
		/*
		 * FIXME "(* = *) == true" but "(* >= *) == false" ? something's amiss
		 * and since this behavior isn't defined in the specification, we'll
		 * have to make an arbitrary choice. The "expected" here is Java's
		 * behavior with Double.POSITIVE_INFINITY.
		 */
		assertResultFalse("1 >= *");
		assertResultTrue("* >= 1");
		assertResultTrue("* >= *");
	}

	public void testUnlimitedGreaterThanOrEqualInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u >= 0");
		assertResultInvalid("let u : UnlimitedNatural = invalid in 0 >= u");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 >= u2");
	}

	public void testUnlimitedGreaterThanOrEqualNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u >= 0");
		assertResultInvalid("let u : UnlimitedNatural = null in 0 >= u");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 >= u2");
	}

	public void testUnlimitedLessThan() {
		assertResultTrue("1 < *");
		assertResultFalse("* < 1");
		assertResultFalse("* < *");
	}

	public void testUnlimitedLessThanInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u < 0");
		assertResultInvalid("let u : UnlimitedNatural = invalid in 0 < u");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 < u2");
	}

	public void testUnlimitedLessThanNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u < 0");
		assertResultInvalid("let u : UnlimitedNatural = null in 0 < u");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 < u2");
	}

	public void testUnlimitedLessThanOrEqual() {
		/*
		 * FIXME "(* = *) == true" but "(* <= *) == false" ? something's amiss
		 * and since this behavior isn't defined in the specification, we'll
		 * have to make an arbitrary choice. The "expected" here is Java's
		 * behavior with Double.POSITIVE_INFINITY.
		 */
		assertResultTrue("1 <= *");
		assertResultFalse("* <= 1");
		assertResultTrue("* <= *");
	}

	public void testUnlimitedLessThanOrEqualInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u <= 0");
		assertResultInvalid("let u : UnlimitedNatural = invalid in 0 <= u");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 <= u2");
	}

	public void testUnlimitedLessThanOrEqualNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u <= 0");
		assertResultInvalid("let u : UnlimitedNatural = null in 0 <= u");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 <= u2");
	}

	public void testUnlimitedMax() {
		assertResultInvalid("1.max(*)");
		assertResultInvalid("*.max(1)");

		assertResultInvalid("(1.0).max(*)");
		assertResultInvalid("*.max(1.0)");

		assertResultInvalid("*.max(*)");
	}

	public void testUnlimitedMaxInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in *.max(u)");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.max(*)");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1.max(u2)");
	}

	public void testUnlimitedMaxNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in *.max(u)");
		assertResultInvalid("let u : UnlimitedNatural = null in u.max(*)");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1.max(u2)");
	}

	public void testUnlimitedMin() {
		assertResultInvalid("1.min(*)");
		assertResultInvalid("*.min(1)");

		assertResultInvalid("(1.0).min(*)");
		assertResultInvalid("*.min(1.0)");

		assertResultInvalid("*.min(*)");
	}

	public void testUnlimitedMinInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in *.min(u)");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.min(*)");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1.min(u2)");
	}

	public void testUnlimitedMinNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in *.min(u)");
		assertResultInvalid("let u : UnlimitedNatural = null in u.min(*)");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1.min(u2)");
	}

	public void testUnlimitedMinus() {
		assertResultInvalid("1 - *");
		assertResultInvalid("* - 1");

		assertResultInvalid("1.0 - *");
		assertResultInvalid("* - 1.0");

		assertResultInvalid("* - *");
	}

	public void testUnlimitedMinusInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in * - u");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u - *");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 - u2");
	}

	public void testUnlimitedMinusNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in * - u");
		assertResultInvalid("let u : UnlimitedNatural = null in u - *");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 - u2");
	}

	public void testUnlimitedMod() {
		/*
		 * FIXME I'm expecting the UnlimitedNatural to conform to Integer, div
		 * and mod calls should then at least parse for them even though they
		 * return an invalid value.
		 */
		assertResultInvalid("1.mod(*)");
		assertResultInvalid("*.mod(1)");

		assertResultInvalid("*.mod(*)");
	}

	public void testUnlimitedModInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in 1.mod(u)");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.mod(1)");
	}

	public void testUnlimitedModNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in 1.mod(u)");
		assertResultInvalid("let u : UnlimitedNatural = null in u.mod(1)");
	}

	public void testUnlimitedNotEqual() {
		assertResultTrue("* <> 1");
		assertResultTrue("1 <> *");
		assertResultTrue("* <> 1.0");
		assertResultTrue("1.0 <> *");
		// FIXME currently, * is encoded as -1 and undistinguishable from it
		// assertResultTrue("* <> -1");
		// assertResultTrue("-1 <> *");
		// assertResultTrue("* <> -1.0");
		// assertResultTrue("-1.0 <> *");

		assertResultFalse("* <> *");
	}

	public void testUnlimitedNotEqualInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u <> *");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 <> u2");
	}

	public void testUnlimitedNotEqualNull() {
		assertResultTrue("let u : UnlimitedNatural = null in u <> *");

		assertResultFalse("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 <> u2");
	}

	public void testUnlimitedOclAsType() {
		// As demanded by the specification, OCL 2.3 (OMG 10-11-42), Section 8.2.1,
		// * when converted to Integer evaluates to invalid. As Integer conforms to
		// Real, * also has to evaluate to invalid when converted to Real.
		assertResultInvalid("*.oclAsType(Integer)");
		assertResultInvalid("*.oclAsType(Real)");
		assertResult(UnlimitedNaturalLiteralExp.UNLIMITED,
				"*.oclAsType(UnlimitedNatural)");
		assertResultInvalid("*.oclAsType(String)");
		assertResult(UnlimitedNaturalLiteralExp.UNLIMITED,
				"*.oclAsType(OclAny)");
		assertResultInvalid("*.oclAsType(OclVoid)");
		assertResultInvalid("*.oclAsType(OclInvalid)");
	}

	public void testUnlimitedOclIsInvalid() {
		assertResultFalse("*.oclIsInvalid()");
	}

	public void testUnlimitedOclIsTypeOf() {
		// From OCL 2.3 (11.5.1): "Note that UnlimitedNatural is a subclass
		// of Integer and that Integer is a subclass of Real"
		assertResultFalse("*.oclIsTypeOf(Integer)");
		assertResultFalse("*.oclIsTypeOf(Real)");
		assertResultTrue("*.oclIsTypeOf(UnlimitedNatural)");
		assertResultFalse("*.oclIsTypeOf(String)");
		assertResultFalse("*.oclIsTypeOf(OclAny)");
		assertResultFalse("*.oclIsTypeOf(OclVoid)");
		assertResultFalse("*.oclIsTypeOf(OclInvalid)");
	}

	public void testUnlimitedOclIsUndefined() {
		assertResultFalse("*.oclIsUndefined()");
	}

	public void testUnlimitedPlus() {
		assertResultInvalid("1 + *");
		assertResultInvalid("* + 1");

		assertResultInvalid("1.0 + *");
		assertResultInvalid("* + 1.0");

		assertResultInvalid("* + *");
	}

	public void testUnlimitedPlusInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in * + u");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u + *");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 + u2");
	}

	public void testUnlimitedPlusNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in * + u");
		assertResultInvalid("let u : UnlimitedNatural = null in u + *");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 + u2");
	}

	public void testUnlimitedRound() {
		assertResultInvalid("*.round()");
	}

	public void testUnlimitedRoundInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in u.round()");
	}

	public void testUnlimitedRoundNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in u.round()");
	}

	public void testUnlimitedTimes() {
		assertResultInvalid("1 * *");
		assertResultInvalid("* * 1");

		assertResultInvalid("1.0 * *");
		assertResultInvalid("* * 1.0");

		assertResultInvalid("* * *");
	}

	public void testUnlimitedTimesInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in * * u");
		assertResultInvalid("let u : UnlimitedNatural = invalid in u * *");

		assertResultInvalid("let u1 : UnlimitedNatural = invalid, u2 : UnlimitedNatural = invalid in u1 * u2");
	}

	public void testUnlimitedTimesNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in * * u");
		assertResultInvalid("let u : UnlimitedNatural = null in u * *");

		assertResultInvalid("let u1 : UnlimitedNatural = null, u2 : UnlimitedNatural = null in u1 * u2");
	}

	public void testUnlimitedToInteger() {
		assertResultInvalid("*.toInteger()");
	}

	public void testUnlimitedUnaryMinus() {
		/*
		 * FIXME OCL doesn't have a negative infinity, this should then be
		 * invalid
		 */
		assertResultInvalid("-*");
	}

	public void testUnlimitedUnaryMinusInvalid() {
		assertResultInvalid("let u : UnlimitedNatural = invalid in -u");
	}

	public void testUnlimitedUnaryMinusNull() {
		assertResultInvalid("let u : UnlimitedNatural = null in -u");
	}
}
