/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import junit.framework.Test;

public class DeprecatedTest extends AbstractRegressionTest {
public DeprecatedTest(String name) {
	super(name);
}
public static Test suite() {
	return setupSuite(testClass());
}
public void test1() {
	this.runNegativeTest(new String[] {
		"p/B.java",
		"package p;\n" + 
		"class B extends A {\n" + 
		"    float x = super.x;\n" + 
		"}\n",

		"p/A.java",
		"package p;\n" + 
		"class A {\n" + 
		"    /** @deprecated */\n" + 
		"    int x = 1;\n" + 
		"}\n",
	}, 
		"----------\n" + 
		"1. WARNING in p\\B.java (at line 3)\n" + 
		"	float x = super.x;\n" + 
		"	      ^\n" + 
		"The field B.x is hiding a field from type A\n" + 
		"----------\n" + 
		"2. WARNING in p\\B.java (at line 3)\n" + 
		"	float x = super.x;\n" + 
		"	          ^^^^^^^\n" + 
		"The field A.x is deprecated\n" + 
		"----------\n"
	);
}
public void test2() {
	this.runNegativeTest(new String[] {
		"p/C.java",
		"package p;\n" + 
		"class C {\n" + 
		"    static int x = new A().x;\n" + 
		"}\n",
		
		"p/A.java",
		"package p;\n" + 
		"class A {\n" + 
		"    /** @deprecated */\n" + 
		"    int x = 1;\n" + 
		"}\n",

	}, 
		"----------\n" + 
		"1. WARNING in p\\C.java (at line 3)\n" + 
		"	static int x = new A().x;\n" + 
		"	                       ^\n" + 
		"The field A.x is deprecated\n" + 
		"----------\n"
	);
}
public void test3() {
	this.runNegativeTest(new String[] {
		"p/Top.java",
		"package p;\n" + 
		"public class Top {\n" + 
		"  \n" + 
		"  class M1 {\n" + 
		"    class M2 {}\n" + 
		"  };\n" + 
		"  \n" + 
		"  static class StaticM1 {\n" + 
		"    static class StaticM2 {\n" + 
		"      class NonStaticM3{}};\n" + 
		"  };\n" + 
		"  \n" + 
		"public static void main(String argv[]){\n" + 
		"  Top tip = new Top();\n" + 
		"  System.out.println(\"Still alive 0\");\n" + 
		"  tip.testStaticMember();\n" + 
		"  System.out.println(\"Still alive 1\");\n" + 
		"  tip.testStaticMember1();\n" + 
		"  System.out.println(\"Still alive 2\");\n" + 
		"  tip.testStaticMember2();\n" + 
		"  System.out.println(\"Still alive 3\");\n" + 
		"  tip.testStaticMember3();\n" + 
		"  System.out.println(\"Still alive 4\");\n" + 
		"  tip.testStaticMember4();\n" + 
		"  System.out.println(\"Completed\");\n" + 
		"}\n" + 
		"  void testMember(){\n" + 
		"    new M1().new M2();}\n" + 
		"  void testStaticMember(){\n" + 
		"    new StaticM1().new StaticM2();}\n" + 
		"  void testStaticMember1(){\n" + 
		"    new StaticM1.StaticM2();}\n" + 
		"  void testStaticMember2(){\n" + 
		"    new StaticM1.StaticM2().new NonStaticM3();}\n" + 
		"  void testStaticMember3(){\n" + 
		"    // define an anonymous subclass of the non-static M3\n" + 
		"    new StaticM1.StaticM2().new NonStaticM3(){};\n" + 
		"  }   \n" + 
		"  void testStaticMember4(){\n" + 
		"    // define an anonymous subclass of the non-static M3\n" + 
		"    new StaticM1.StaticM2().new NonStaticM3(){\n" + 
		"      Object hello(){\n" + 
		"        return new StaticM1.StaticM2().new NonStaticM3();\n" + 
		"      }};\n" + 
		"      \n" + 
		"  }    \n" + 
		"}\n",
		}, 
		"----------\n" + 
		"1. ERROR in p\\Top.java (at line 30)\n" + 
		"	new StaticM1().new StaticM2();}\n" + 
		"	^^^^^^^^^^^^^^\n" + 
		"Illegal enclosing instance specification for type Top.StaticM1.StaticM2\n" + 
		"----------\n"	);
}
/**
 * Regression test for PR #1G9ES9B
 */
public void test4() {
	this.runNegativeTest(new String[] {
		"p/Warning.java",
		"package p;\n" + 
		"import java.util.Date;\n" +
		"public class Warning {\n" +
		"public Warning() {\n" +
		"     super();\n" +
		"     Date dateObj = new Date();\n" +
		"     dateObj.UTC(1,2,3,4,5,6);\n" +
		"}\n" +
		"}\n",
		}, 
		"----------\n" + 
		"1. WARNING in p\\Warning.java (at line 7)\n" + 
		"	dateObj.UTC(1,2,3,4,5,6);\n" + 
		"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"The method UTC(int, int, int, int, int, int) from the type Date is deprecated\n" + 
		"----------\n" + 
		"2. WARNING in p\\Warning.java (at line 7)\n" + 
		"	dateObj.UTC(1,2,3,4,5,6);\n" + 
		"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"The static method UTC(int, int, int, int, int, int) from the type Date should be accessed in a static way\n" + 
		"----------\n"

	);
}
public void test5() {
	this.runConformTest(
		new String[] {
			"X.java",
		  "public class X {\n"
			+ "/**\n"
			+ " * @deprecated\n"
			+ " */\n"
			+ " 	public static class Y {\n"
			+ "	}\n" +
			"   public static void main(String[] args) {	\n" +
			"        System.out.print(\"SUCCESS\");	\n" +
			"	}	\n"
			+ "}"
		},
		"SUCCESS", // expected output
		null,
		true, // flush previous output dir content
		null, // special vm args
		null);  // custom options
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A extends X.Y {}"
		},
		"----------\n" + 
		"1. WARNING in A.java (at line 1)\n" + 
		"	public class A extends X.Y {}\n" + 
		"	             ^\n" + 
		"The constructor X.Y() is deprecated\n" + 
		"----------\n" + 
		"2. WARNING in A.java (at line 1)\n" + 
		"	public class A extends X.Y {}\n" + 
		"	                       ^^^\n" + 
		"The type X.Y is deprecated\n" + 
		"----------\n",// expected output
		null,
		false, // flush previous output dir content
		null);  // custom options
}
public static Class testClass() {
	return DeprecatedTest.class;
}
}
