/*******************************************************************************
 * Copyright (c) 2006, 2014 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
/*
 * Here we focus on various aspects of the runtime behavior of the generated
 * code.
 */
package org.eclipse.jdt.core.tests.compiler.regression;

import java.util.Map;

import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

import junit.framework.Test;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class SerialVersionUIDTests extends AbstractRegressionTest {

public SerialVersionUIDTests(String name) {
	super(name);
}
// Static initializer to specify tests subset using TESTS_* static variables
// All specified tests which does not belong to the class are skipped...
// Only the highest compliance level is run; add the VM argument
// -Dcompliance=1.4 (for example) to lower it if needed
static {
//		TESTS_NAMES = new String[] { "test0001" };
//	 	TESTS_NUMBERS = new int[] { 1 };
//		TESTS_RANGE = new int[] { 1, -1 };
}
public static Test suite() {
	return buildAllCompliancesTestSuite(testClass());
}
public static Class testClass() {
	return SerialVersionUIDTests.class;
}
protected Map getCompilerOptions() {
	Map options = super.getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportMissingSerialVersion, CompilerOptions.ERROR);
	return options;
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=101476
public void test001() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X implements Serializable {\n" +
			"	private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException {}\n" +
			"	private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {}\n" +
			"}"
		},
		""
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101476
public void test002() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X implements java.io.Externalizable {\n" +
			"	public void writeExternal(java.io.ObjectOutput out) throws java.io.IOException {}\n" +
			"	public void readExternal(java.io.ObjectInput in) throws java.io.IOException, ClassNotFoundException {}\n" +
			"}"
		},
		""
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101476
public void test003() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X implements java.io.Serializable {\n" +
			"	private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X implements java.io.Serializable {\n" +
		"	             ^\n" +
		"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
		"----------\n",
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101476
public void test004() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X implements java.io.Serializable {\n" +
			"	private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException {}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X implements java.io.Serializable {\n" +
		"	             ^\n" +
		"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
		"----------\n",
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101476
public void test005() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X implements java.io.Serializable {\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X implements java.io.Serializable {\n" +
		"	             ^\n" +
		"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
		"----------\n",
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101476
public void test006() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X implements java.io.Serializable {\n" +
			"	Object writeReplace() throws java.io.ObjectStreamException { return null;}\n" +
			"}"
		},
		""
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203241
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=116733
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=94352
public void test007() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"abstract class A implements java.io.Serializable {}\n" +
			"public class X extends A {}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	abstract class A implements java.io.Serializable {}\n" +
		"	               ^\n" +
		"The serializable class A does not declare a static final serialVersionUID field of type long\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 2)\n" +
		"	public class X extends A {}\n" +
		"	             ^\n" +
		"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
		"----------\n",
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285124
public void test008() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends javax.rmi.CORBA.Stub {\n" +
				"	public String[] _ids() { return null; }\n" +
				"}"
			},
			""
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285124
public void test009() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	public String[] _ids() { return null; }\n" +
				"}",
				"Y.java",
				"public abstract class Y extends javax.rmi.CORBA.Stub {\n" +
				"}"
			},
			""
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285124
public void test010() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	public String[] _ids() { return null; }\n" +
				"}",
				"Y.java",
				"public abstract class Y extends Z {\n" +
				"}",
				"Z.java",
				"public abstract class Z extends javax.rmi.CORBA.Stub {\n" +
				"}"
			},
			""
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=341475
public void test011() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	private static final long serialVersionUID = 1L;\n" + 
		"	                          ^^^^^^^^^^^^^^^^\n" + 
		"The value of the field X.serialVersionUID is not used\n" + 
		"----------\n",
		null,
		true,
		options
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=341475
public void test012() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	private static final long serialVersionUID = 1L;\n" + 
		"	                          ^^^^^^^^^^^^^^^^\n" + 
		"The value of the field X<T>.serialVersionUID is not used\n" + 
		"----------\n",
		null,
		true,
		options
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=341475
public void test013() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	private static final long serialPersistentFields = 1L;\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	private static final long serialPersistentFields = 1L;\n" + 
		"	                          ^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"The value of the field X<T>.serialPersistentFields is not used\n" + 
		"----------\n",
		null,
		true,
		options
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=341475
public void test014() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	private static final long serialPersistentFields = 1L;\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	private static final long serialPersistentFields = 1L;\n" + 
		"	                          ^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"The value of the field X.serialPersistentFields is not used\n" + 
		"----------\n",
		null,
		true,
		options
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=341475
public void test015() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.ObjectStreamField;\n" +
			"public class X<T> implements java.io.Serializable {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"	private final static ObjectStreamField[] serialPersistentFields = null;\n" +
			"	private int i;\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 5)\n" + 
		"	private int i;\n" + 
		"	            ^\n" + 
		"The value of the field X<T>.i is not used\n" + 
		"----------\n",
		null,
		true,
		options
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=341475
public void test016() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.ObjectStreamField;\n" +
			"public class X implements java.io.Serializable {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"	private final static ObjectStreamField[] serialPersistentFields = null;\n" +
			"	private int i;\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 5)\n" + 
		"	private int i;\n" + 
		"	            ^\n" + 
		"The value of the field X.i is not used\n" + 
		"----------\n",
		null,
		true,
		options
	);
}
}
