/*******************************************************************************
 * Copyright (c) 2005, 2014 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import junit.framework.Test;

@SuppressWarnings({ "rawtypes" })
public class NumericTest extends AbstractRegressionTest {

public NumericTest(String name) {
	super(name);
}
public static Test suite() {
	return buildAllCompliancesTestSuite(testClass());
}

public void test001() {
	this.runConformTest(new String[] {
		"p/B.java",
		"package p;\n" +
		"public class B {\n" +
		"  public static void main(String[] args) {\n" +
		"    int offset = -8;\n" +
		"    int temp = 0 - offset;\n" +
		"    offset = 0 - offset;  // This is the problem line\n" +
		"    System.out.println(\"offset: \" + offset);\n" +
		"    System.out.println(\"temp: \" + temp);\n" +
		"    if (offset != temp ) {\n" +
		"      System.err.println(\"offset (\" + offset + \") should be equal to temp (\" + temp + \").\");\n" +
		"      System.exit(-1);\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}

public void test002() {
	this.runConformTest(new String[] {
		"p/Y.java",
		"package p;\n" +
		"public class Y {\n" +
		"  public static void main(String[] args) {\n" +
		"    int clockend = 0;\n" +
		"    clockend += 128;\n" +
		"    if(clockend < 0) {\n" +
		"      System.out.println(clockend);\n" +
		"      System.exit(-1);\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=133738
public void test003() {
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" +
		"  int i1 = -2147483648;\n" +
		"  int i2 = -(2147483648);\n" +
		"}",
	},
	"----------\n" +
	"1. ERROR in X.java (at line 3)\n" +
	"	int i2 = -(2147483648);\n" +
	"	          ^^^^^^^^^^^^\n" +
	"The literal 2147483648 of type int is out of range \n" +
	"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133738
public void test004() {
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" +
		"  long l1 = -9223372036854775808L;\n" +
		"  long l2 = -(9223372036854775808L);\n" +
		"}",
	},
	"----------\n" +
	"1. ERROR in X.java (at line 3)\n" +
	"	long l2 = -(9223372036854775808L);\n" +
	"	           ^^^^^^^^^^^^^^^^^^^^^^\n" +
	"The literal 9223372036854775808L of type long is out of range \n" +
	"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232814
public void test005() {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		int result;\n" +
		"		if (130 != (result = testShort1())) System.out.println(\"failed-testShort1():\" + result);\n" +
		"		if (130 != (result = testShort2())) System.out.println(\"failed-testShort2():\" + result);\n" +
		"		if (130 != (result = testInt1())) System.out.println(\"failed-testInt1():\" + result);\n" +
		"		if (130 != (result = testInt2())) System.out.println(\"failed-testInt2():\" + result);\n" +
		"		if (30 != (result = testByte1())) System.out.println(\"failed-testByte1():\" + result);\n" +
		"		if (30 != (result = testByte2())) System.out.println(\"failed-testByte2():\" + result);\n" +
		"		System.out.println(\"done\");\n" +
		"	}\n" +
		"	static int testShort1() {\n" +
		"		short min = Short.MIN_VALUE;\n" +
		"		int num = -32638;\n" +
		"		return num = num - min;\n" +
		"	}\n" +
		"	static int testShort2() {\n" +
		"		final short min = Short.MIN_VALUE;\n" +
		"		int num = -32638;\n" +
		"		return num = num - min;\n" +
		"	}\n" +
		"	static int testInt1() {\n" +
		"		short min = Short.MIN_VALUE;\n" +
		"		int num = -32638;\n" +
		"		return num = num - min;\n" +
		"	}\n" +
		"	static int testInt2() {\n" +
		"		final short min = Short.MIN_VALUE;\n" +
		"		int num = -32638;\n" +
		"		return num = num - min;\n" +
		"	}	\n" +
		"	static int testByte1() {\n" +
		"		byte min = Byte.MIN_VALUE;\n" +
		"		int num = -98;\n" +
		"		return num = num - min;\n" +
		"	}\n" +
		"	static int testByte2() {\n" +
		"		final byte min = Byte.MIN_VALUE;\n" +
		"		int num = -98;\n" +
		"		return num = num - min;\n" +
		"	}		\n" +
		"}\n",
	},
	"done");
}
public static Class testClass() {
	return NumericTest.class;
}
}
