/*******************************************************************************
 * Copyright (c) 2000, 2015 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 java.util.Map;

import junit.framework.Test;

import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class JavadocTest_1_4 extends JavadocTest {

	String docCommentSupport = CompilerOptions.ENABLED;
	String reportInvalidJavadoc = CompilerOptions.ERROR;
	String reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
	String reportMissingJavadocTags = CompilerOptions.ERROR;
	String reportMissingJavadocComments = null;
	String reportMissingJavadocCommentsVisibility = null;

	public JavadocTest_1_4(String name) {
		super(name);
	}

	public static Class testClass() {
		return JavadocTest_1_4.class;
	}

	// Use this static initializer to specify subset for tests
	// All specified tests which does not belong to the class are skipped...
	static {
//		TESTS_PREFIX = "testBug95521";
//		TESTS_NAMES = new String[] {
//			"testBug70892conform1", "testBug70892conform2"
//		};
//		TESTS_NUMBERS = new int[] { 101283 };
//		TESTS_RANGE = new int[] { 21, 50 };
	}
	public static Test suite() {
		return buildMinimalComplianceTestSuite(testClass(), F_1_4);
	}

	@Override
	protected Map getCompilerOptions() {
		Map options = super.getCompilerOptions();
		options.put(CompilerOptions.OPTION_DocCommentSupport, this.docCommentSupport);
		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, this.reportInvalidJavadoc);
		if (!CompilerOptions.IGNORE.equals(this.reportInvalidJavadoc)) {
			options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility, this.reportInvalidJavadocVisibility);
		}
		if (this.reportMissingJavadocComments != null)
			options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, this.reportMissingJavadocComments);
		else
			options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, this.reportInvalidJavadoc);
		if (this.reportMissingJavadocCommentsVisibility != null)
			options.put(CompilerOptions.OPTION_ReportMissingJavadocCommentsVisibility, this.reportMissingJavadocCommentsVisibility);
		if (this.reportMissingJavadocTags != null)
			options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, this.reportMissingJavadocTags);
		else
			options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, this.reportInvalidJavadoc);
		options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE);
		options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE);
		options.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.ERROR);
		options.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.ERROR);
		return options;
	}
	/* (non-Javadoc)
	 * @see junit.framework.TestCase#setUp()
	 */
	@Override
	protected void setUp() throws Exception {
		super.setUp();
		this.docCommentSupport = CompilerOptions.ENABLED;
		this.reportInvalidJavadoc = CompilerOptions.ERROR;
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		this.reportMissingJavadocTags = CompilerOptions.ERROR;
		this.reportMissingJavadocComments = CompilerOptions.IGNORE;
	}


	/**
	 * Test fix for bug 70891: [1.5][javadoc] Compiler should accept new 1.5 syntax for @param
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=70891">70891</a>
	 * These two tests fail for 1.5 source level but should pass for 1.3 or 1.4
	 * @see JavadocTest_1_4
	 */
	/* (non-Javadoc)
	 * Test @param for generic class type parameter
	 */
	public void test003() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Valid type parameter reference\n" +
					"  * @param <E> Type\n" +
					"  */\n" +
					" public class X<E> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\r\n" +
				"	* @param <E> Type\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\r\n" +
				"	public class X<E> {}\r\n" +
				"	               ^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test004() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Valid type parameter reference\n" +
					"  * @param <E> Type extends RuntimeException\n" +
					"  */\n" +
					" public class X<E extends RuntimeException> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\r\n" +
				"	* @param <E> Type extends RuntimeException\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\r\n" +
				"	public class X<E extends RuntimeException> {}\r\n" +
				"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"

		);
	}
	public void test005() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Valid type parameter reference\n" +
					"  * @param <T> Type parameter 1\n" +
					"  * @param <U> Type parameter 2\n" +
					"  * @param <V> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\r\n" +
				"	* @param <T> Type parameter 1\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\r\n" +
				"	* @param <U> Type parameter 2\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\r\n" +
				"	* @param <V> Type parameter 3\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\r\n" +
				"	public class X<T, U, V> {}\r\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test006() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <E> Type parameter\n" +
					"  */\n" +
					" public class X {}",
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <E> Type parameter\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n"
		);
	}
	public void test007() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <E> Type parameter\n" +
					"  */\n" +
					" public class X<E, F> {}",
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <E> Type parameter\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	public class X<E, F> {}\n" +
				"	               ^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test008() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <T> Type parameter 1\n" +
					"  * @param <U> Type parameter 2\n" +
					"  * @param <V> Type parameter 3\n" +
					"  */\n" +
					" public class X<T> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\n" +
				"	public class X<T> {}\n" +
				"	               ^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test009() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <T> Type parameter 1\n" +
					"  * @param <X> Type parameter 2\n" +
					"  * @param <U> Type parameter 2\n" +
					"  * @param <E> Type parameter 2\n" +
					"  * @param <V> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <X> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 6)\n" +
				"	* @param <E> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 9)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test010() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Valid type parameter reference\n" +
					"  * @param <V> Type parameter 3\n" +
					"  * @param <U> Type parameter 2\n" +
					"  * @param <T> Type parameter 1\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\r\n" +
				"	* @param <V> Type parameter 3\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\r\n" +
				"	* @param <U> Type parameter 2\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\r\n" +
				"	* @param <T> Type parameter 1\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\r\n" +
				"	public class X<T, U, V> {}\r\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test011() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <U> Type parameter 1\n" +
					"  * @param <E> Type parameter 2\n" +
					"  * @param <V> Type parameter 2\n" +
					"  * @param <U> Type parameter 2\n" +
					"  * @param <T> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <E> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 6)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	* @param <T> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 9)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test012() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test013() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <T> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test014() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <U> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <U> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test015() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <U> Type parameter 3\n" +
					"  * @param <V> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <U> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test016() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <T> Type parameter 3\n" +
					"  * @param <V> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test017() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <T> Type parameter 3\n" +
					"  * @param <U> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <U> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test018() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <V> Type parameter 3\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test019() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <V> Type parameter 2\n" +
					"  * @param <X> Type parameter 2\n" +
					"  * @param <U> Type parameter 1\n" +
					"  * @param <E> Type parameter 2\n" +
					"  * @param <U> Type parameter 2\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <X> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 6)\n" +
				"	* @param <E> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 9)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test020() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <V> Type parameter 2\n" +
					"  * @param\n" +
					"  * @param <U> Type parameter 1\n" +
					"  */\n" +
					" public class X<T, U, V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param\n" +
				"	   ^^^^^\n" +
				"Javadoc: Missing parameter name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\n" +
				"	public class X<T, U, V> {}\n" +
				"	               ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test021() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference: compile error\n" +
					"  * @param <T> Type parameter 2\n" +
					"  * @param <V> Type parameter 2\n" +
					"  * @param <U> Type parameter 1\n" +
					"  */\n" +
					" public class X<T, , V> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\n" +
				"	public class X<T, , V> {}\n" +
				"	              ^^\n" +
				"Syntax error on tokens, delete these tokens\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	public class X<T, , V> {}\n" +
				"	               ^\n" +
				"Syntax error, insert \"ClassBody\" to complete CompilationUnit\n" +
				"----------\n"
		);
	}
	public void test022() {
		this.runNegativeTest(
			new String[] {
				"X.java",
					" /**\n" +
					"  * Invalid type parameter reference: compile error\n" +
					"  * @param <T> Type parameter 2\n" +
					"  * @param <V> Type parameter 2\n" +
					"  * @param <U> Type parameter 1\n" +
					"  */\n" +
					" public class X<T, U, V extend Exception> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <T> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\n" +
				"	public class X<T, U, V extend Exception> {}\n" +
				"	              ^^^^^^\n" +
				"Syntax error on tokens, delete these tokens\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	public class X<T, U, V extend Exception> {}\n" +
				"	                   ^\n" +
				"Syntax error, insert \"ClassBody\" to complete CompilationUnit\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 7)\n" +
				"	public class X<T, U, V extend Exception> {}\n" +
				"	                       ^^^^^^\n" +
				"extend cannot be resolved to a type\n" +
				"----------\n"
		);
	}

	/* (non-Javadoc)
	 * Test @param for generic method type parameter
	 */
	public void test023() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Valid type parameter reference\n" +
					"	 * @param <E> Type\n" +
					"	 */\n" +
					"	public <E> void foo() {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\r\n" +
				"	* @param <E> Type\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 6)\r\n" +
				"	public <E> void foo() {}\r\n" +
				"	        ^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test024() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Valid type parameter reference\n" +
					"	 * @param <E> Type extends RuntimeException\n" +
					"	 * @param val int\n" +
					"	 * @param obj Object\n" +
					"	 */\n" +
					"	public <E extends RuntimeException> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\r\n" +
				"	* @param <E> Type extends RuntimeException\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 8)\r\n" +
				"	public <E extends RuntimeException> void foo(int val, Object obj) {}\r\n" +
				"	        ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test025() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Valid type parameter reference\n" +
					"	 * @param val int\n" +
					"	 * @param obj Object\n" +
					"	 * @param <T> Type parameter 1\n" +
					"	 * @param <U> Type parameter 2\n" +
					"	 * @param <V> Type parameter 3\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 6)\r\n" +
				"	* @param <T> Type parameter 1\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 7)\r\n" +
				"	* @param <U> Type parameter 2\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 8)\r\n" +
				"	* @param <V> Type parameter 3\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 10)\r\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\r\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test026() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param val int\n" +
					"	 * @param <E> Type parameter\n" +
					"	 * @param obj Object\n" +
					"	 */\n" +
					"	public void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 5)\n" +
				"	* @param <E> Type parameter\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n"
		);
	}
	public void test027() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param <E> Type parameter\n" +
					"	 */\n" +
					"	public <E, F> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	* @param <E> Type parameter\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 6)\n" +
				"	public <E, F> void foo(int val, Object obj) {}\n" +
				"	        ^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	public <E, F> void foo(int val, Object obj) {}\n" +
				"	                           ^^^\n" +
				"Javadoc: Missing tag for parameter val\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 6)\n" +
				"	public <E, F> void foo(int val, Object obj) {}\n" +
				"	                                       ^^^\n" +
				"Javadoc: Missing tag for parameter obj\n" +
				"----------\n"
		);
	}
	public void test028() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param <T> Type parameter 1\n" +
					"	 * @param <U> Type parameter 2\n" +
					"	 * @param <V> Type parameter 3\n" +
					"	 * @param xxx int\n" +
					"	 * @param Obj Object\n" +
					"	 */\n" +
					"	public <T> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	* @param <T> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 7)\n" +
				"	* @param xxx int\n" +
				"	         ^^^\n" +
				"Javadoc: Parameter xxx is not declared\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 8)\n" +
				"	* @param Obj Object\n" +
				"	         ^^^\n" +
				"Javadoc: Parameter Obj is not declared\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 10)\n" +
				"	public <T> void foo(int val, Object obj) {}\n" +
				"	        ^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"7. ERROR in X.java (at line 10)\n" +
				"	public <T> void foo(int val, Object obj) {}\n" +
				"	                        ^^^\n" +
				"Javadoc: Missing tag for parameter val\n" +
				"----------\n" +
				"8. ERROR in X.java (at line 10)\n" +
				"	public <T> void foo(int val, Object obj) {}\n" +
				"	                                    ^^^\n" +
				"Javadoc: Missing tag for parameter obj\n" +
				"----------\n"
		);
	}
	public void test029() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param <T> Type parameter 1\n" +
					"	 * @param <X> Type parameter 2\n" +
					"	 * @param val int\n" +
					"	 * @param <U> Type parameter 2\n" +
					"	 * @param <E> Type parameter 2\n" +
					"	 * @param obj Object\n" +
					"	 * @param <V> Type parameter 3\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	* @param <T> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	* @param <X> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 7)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 8)\n" +
				"	* @param <E> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 10)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 12)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test030() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Valid type parameter reference\n" +
					"	 * @param <V> Type parameter 3\n" +
					"	 * @param obj Object\n" +
					"	 * @param <U> Type parameter 2\n" +
					"	 * @param val int\n" +
					"	 * @param <T> Type parameter 1\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\r\n" +
				"	* @param <V> Type parameter 3\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 6)\r\n" +
				"	* @param <U> Type parameter 2\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 8)\r\n" +
				"	* @param <T> Type parameter 1\r\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 10)\r\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\r\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test031() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 5)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                              ^^^\n" +
				"Javadoc: Missing tag for parameter val\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                                          ^^^\n" +
				"Javadoc: Missing tag for parameter obj\n" +
				"----------\n"
		);
	}
	public void test032() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param <T> Type parameter 3\n" +
					"	 * @param val int\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	* @param <T> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 7)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 7)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                                          ^^^\n" +
				"Javadoc: Missing tag for parameter obj\n" +
				"----------\n"
		);
	}
	public void test033() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param obj Object\n" +
					"	 * @param <U> Type parameter 3\n" +
					"	 * @param <V> Type parameter 3\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 5)\n" +
				"	* @param <U> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 6)\n" +
				"	* @param <V> Type parameter 3\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 8)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 8)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                              ^^^\n" +
				"Javadoc: Missing tag for parameter val\n" +
				"----------\n"
		);
	}
	public void test034() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param val int\n" +
					"	 * @param <V> Type parameter 2\n" +
					"	 * @param <X> Type parameter 2\n" +
					"	 * @param <U> Type parameter 1\n" +
					"	 * @param Object obj\n" +
					"	 * @param <E> Type parameter 2\n" +
					"	 * @param <U> Type parameter 2\n" +
					"	 * @param val int\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 5)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 6)\n" +
				"	* @param <X> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 7)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 8)\n" +
				"	* @param Object obj\n" +
				"	         ^^^^^^\n" +
				"Javadoc: Parameter Object is not declared\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 9)\n" +
				"	* @param <E> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 10)\n" +
				"	* @param <U> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"7. ERROR in X.java (at line 11)\n" +
				"	* @param val int\n" +
				"	         ^^^\n" +
				"Javadoc: Duplicate tag for parameter\n" +
				"----------\n" +
				"8. ERROR in X.java (at line 13)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"9. ERROR in X.java (at line 13)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                                          ^^^\n" +
				"Javadoc: Missing tag for parameter obj\n" +
				"----------\n"
		);
	}
	public void test035() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference\n" +
					"	 * @param <V> Type parameter 2\n" +
					"	 * @param\n" +
					"	 * @param <U> Type parameter 1\n" +
					"	 */\n" +
					"	public <T, U, V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	* @param\n" +
				"	   ^^^^^\n" +
				"Javadoc: Missing parameter name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 8)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	        ^^^^^^^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 8)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                              ^^^\n" +
				"Javadoc: Missing tag for parameter val\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 8)\n" +
				"	public <T, U, V> void foo(int val, Object obj) {}\n" +
				"	                                          ^^^\n" +
				"Javadoc: Missing tag for parameter obj\n" +
				"----------\n"
		);
	}
	// TODO (david) recovery seems not to work properly here:
	// we should have type parameters in method declaration.
	public void test036() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference: compile error\n" +
					"	 * @param <T> Type parameter 2\n" +
					"	 * @param <V> Type parameter 2\n" +
					"	 * @param <U> Type parameter 1\n" +
					"	 * @param val int\n" +
					"	 * @param obj Object\n" +
					"	 */\n" +
					"	public <T, , V> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	* @param <T> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	* @param <V> Type parameter 2\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	* @param <U> Type parameter 1\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 10)\n" +
				"	public <T, , V> void foo(int val, Object obj) {}\n" +
				"	       ^^^^^^^^\n" +
				"Syntax error on tokens, delete these tokens\n" +
				"----------\n"
		);
	}
	public void test037() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" public class X {\n" +
					"	/**\n" +
					"	 * Invalid type parameter reference: compile error\n" +
					"	 * @param <T> Type parameter 2\n" +
					"	 * @param <V> Type parameter 2\n" +
					"	 * @param <U> Type parameter 1\n" +
					"	 * @param val int\n" +
					"	 * @param obj Object\n" +
					"	 */\n" +
					"	public <T, U, V extends Exceptions> void foo(int val, Object obj) {}\n" +
					"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	* @param <T> Type parameter 2\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	* @param <V> Type parameter 2\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 6)\n" +
			"	* @param <U> Type parameter 1\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 10)\n" +
			"	public <T, U, V extends Exceptions> void foo(int val, Object obj) {}\n" +
			"	        ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 10)\n" +
			"	public <T, U, V extends Exceptions> void foo(int val, Object obj) {}\n" +
			"	                        ^^^^^^^^^^\n" +
			"Exceptions cannot be resolved to a type\n" +
			"----------\n"
		);
	}
	public void test038() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param < Type\n" +
					"  * @param < Type for parameterization\n" +
					"  * @param <> Type\n" +
					"  * @param <?> Type\n" +
					"  * @param <*> Type\n" +
					"  */\n" +
					" public class X<E> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param < Type\n" +
				"	         ^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param < Type for parameterization\n" +
				"	         ^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <> Type\n" +
				"	         ^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 6)\n" +
				"	* @param <?> Type\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	* @param <*> Type\n" +
				"	         ^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 9)\n" +
				"	public class X<E> {}\n" +
				"	               ^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}
	public void test039() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" /**\n" +
					"  * Invalid type parameter reference\n" +
					"  * @param <E Type parameter of class X\n" +
					"  * @param E> Type\n" +
					"  * @param <<E> Type\n" +
					"  * @param <<<E> Type\n" +
					"  * @param <E>> Type\n" +
					"  */\n" +
					" public class X<E> {}"
			},
			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	* @param <E Type parameter of class X\n" +
				"	         ^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 4)\n" +
				"	* @param E> Type\n" +
				"	         ^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	* @param <<E> Type\n" +
				"	         ^^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 6)\n" +
				"	* @param <<<E> Type\n" +
				"	         ^^^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"5. ERROR in X.java (at line 7)\n" +
				"	* @param <E>> Type\n" +
				"	         ^^^^\n" +
				"Javadoc: Invalid param tag name\n" +
				"----------\n" +
				"6. ERROR in X.java (at line 9)\n" +
				"	public class X<E> {}\n" +
				"	               ^\n" +
				"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
				"----------\n"
		);
	}

	public void test040() {
		runConformReferenceTest(
			new String[] {
				"X.java",
				"/**\n" +
				" * @category\n" +
				" */\n" +
				"public class X {\n" +
				"}\n"
			}
		);
	}

	/**
	 * Test fix for bug 80257: [javadoc] Invalid missing reference warning on @see or @link tags
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=80257"
	 */
	public void testBug80257() {
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" +
				" * @see G#G(Object)\n" +
				" * @see G#G(Exception)\n" +
				" */\n" +
				"public class X extends G<Exception> {\n" +
				"	X(Exception exc) { super(exc);}\n" +
				"}\n" +
				"class G<E extends Exception> {\n" +
				"	G(E e) {}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	* @see G#G(Object)\n" +
			"	         ^^^^^^^^^\n" +
			"Javadoc: The constructor G(Object) is undefined\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	public class X extends G<Exception> {\n" +
			"	                         ^^^^^^^^^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	class G<E extends Exception> {\n" +
			"	        ^^^^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}

	/**
	 * Test fix for bug 82514: [1.5][javadoc] Problem with generics in javadoc
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=82514"
	 */
	public void testBug82514() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class ComparableUtils {\n" +
				"   public static <T extends Comparable< ? super T>> int compareTo(final Object first, final Object firstPrime,  final Class<T> type) throws ClassCastException\n" +
				"    {\n" +
				"        return 0;\n" +
				"    }\n" +
				"    public static <X extends Comparable< ? super X>> int compareTo(final X first, final X firstPrime)\n" +
				"        throws ClassCastException\n" +
				"    {\n" +
				"        return 0;\n" +
				"    }\n" +
				"}\n" +
				"public final class X {  \n" +
				"	/** Tests the method{@link ComparableUtils#compareTo(Object, Object, Class)} and\n" +
				"	 *  {@link ComparableUtils#compareTo(Object, Object)}.\n" +
				"	 */\n" +
				"    public void testCompareTo() {}\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public static <T extends Comparable< ? super T>> int compareTo(final Object first, final Object firstPrime,  final Class<T> type) throws ClassCastException\n" +
			"	               ^^^^^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 2)\n" +
			"	public static <T extends Comparable< ? super T>> int compareTo(final Object first, final Object firstPrime,  final Class<T> type) throws ClassCastException\n" +
			"	                                                                                                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 6)\n" +
			"	public static <X extends Comparable< ? super X>> int compareTo(final X first, final X firstPrime)\n" +
			"	               ^^^^^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 6)\n" +
			"	public static <X extends Comparable< ? super X>> int compareTo(final X first, final X firstPrime)\n" +
			"	               ^\n" +
			"The type parameter X is hiding the type X\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 14)\n" +
			"	*  {@link ComparableUtils#compareTo(Object, Object)}.\n" +
			"	                          ^^^^^^^^^\n" +
			"Javadoc: The method compareTo(Object, Object, Class<T>) in the type ComparableUtils is not applicable for the arguments (Object, Object)\n" +
			"----------\n");
	}

	/**
	 * Test fix for bug 83127: [1.5][javadoc][dom] Wrong / strange bindings for references in javadoc to methods with type variables as parameter types
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83127"
	 */
	public void testBug83127a() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Test.java",
				"/** \n" +
				" * @see Test#add(T) \n" +
				" * @see #add(T)\n" +
				" * @see Test#Test(T)\n" +
				" * @see #Test(T)\n" +
				" *   - warning = \"The method add(Object) in the type Test is not applicable for\n" +
				" *                the arguments (T)\"\n" +
				" *   - method binding = Test.add(Object)\n" +
				" *   - parameter binding = T of A\n" +
				" */\n" +
				"public class Test<T> {\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Test#add(T) \n" +
			"	            ^^^\n" +
			"Javadoc: The method add(Object) in the type Test is not applicable for the arguments (T)\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 3)\n" +
			"	* @see #add(T)\n" +
			"	        ^^^\n" +
			"Javadoc: The method add(Object) in the type Test is not applicable for the arguments (T)\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 4)\n" +
			"	* @see Test#Test(T)\n" +
			"	            ^^^^^^^\n" +
			"Javadoc: The constructor Test(T) is undefined\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 5)\n" +
			"	* @see #Test(T)\n" +
			"	        ^^^^^^^\n" +
			"Javadoc: The constructor Test(T) is undefined\n" +
			"----------\n" +
			"5. ERROR in Test.java (at line 11)\n" +
			"	public class Test<T> {\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"6. ERROR in Test.java (at line 18)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"7. ERROR in Test.java (at line 18)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127b() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Test.java",
				"/** \n" +
				" * @see Sub#add(T)\n" +
				" * @see Sub#Sub(T)\n" +
				" *   - warning = \"The method add(Object) in the type Test is not applicable for\n" +
				" *                the arguments (T)\"\n" +
				" *   - method binding = Test.add(Object)\n" +
				" *   - parameter binding = T of A\n" +
				" *     -> Do we need to change this as T natually resolved to TypeVariable?\n" +
				" *        As compiler raises a warning, it\'s perhaps not a problem now...\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Sub#add(T)\n" +
			"	           ^^^\n" +
			"Javadoc: The method add(Number) in the type Sub is not applicable for the arguments (T)\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 3)\n" +
			"	* @see Sub#Sub(T)\n" +
			"	           ^^^^^^\n" +
			"Javadoc: The constructor Sub(T) is undefined\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 11)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 18)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"5. ERROR in Test.java (at line 18)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127c() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Test.java",
				"/** \n" +
				" * @see Sub#add(E) \n" +
				" * @see Sub#Sub(E)\n" +
				" *   - warning = \"E cannot be resolved to a type\"\n" +
				" *   - method binding = null\n" +
				" *   - parameter binding = null\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Sub#add(E) \n" +
			"	               ^\n" +
			"Javadoc: E cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 3)\n" +
			"	* @see Sub#Sub(E)\n" +
			"	               ^\n" +
			"Javadoc: E cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 8)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 15)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"5. ERROR in Test.java (at line 15)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127d() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Unrelated1.java",
				"public class Unrelated1<E extends Number> {\n" +
				"	public Unrelated1(E e) {}\n" +
				"	public boolean add(E e) { return false; }\n" +
				"}\n",
				"Test.java",
				"/** \n" +
				" * @see Unrelated1#add(E)\n" +
				" * @see Unrelated1#Unrelated1(E)\n" +
				" *   - warning = \"E cannot be resolved to a type\"\n" +
				" *   - method binding = null\n" +
				" *   - parameter binding = null\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Unrelated1.java (at line 1)\n" +
			"	public class Unrelated1<E extends Number> {\n" +
			"	                        ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Unrelated1#add(E)\n" +
			"	                      ^\n" +
			"Javadoc: E cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 3)\n" +
			"	* @see Unrelated1#Unrelated1(E)\n" +
			"	                             ^\n" +
			"Javadoc: E cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 8)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 15)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"5. ERROR in Test.java (at line 15)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127e() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Unrelated1.java",
				"public class Unrelated1<E extends Number> {\n" +
				"	public Unrelated1(E e) {}\n" +
				"	public boolean add(E e) { return false; }\n" +
				"}\n",
				"Test.java",
				"/** \n" +
				" * @see Unrelated1#add(Object)\n" +
				" * @see Unrelated1#Unrelated1(Object)\n" +
				" *   - warning = \"The method add(Object) in the type Test is not applicable for\n" +
				" *                the arguments (Object)\"\n" +
				" *   - method binding = Unrelated1.add(Number)\n" +
				" *   - parameter binding = java.lang.Object\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Unrelated1.java (at line 1)\n" +
			"	public class Unrelated1<E extends Number> {\n" +
			"	                        ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Unrelated1#add(Object)\n" +
			"	                  ^^^\n" +
			"Javadoc: The method add(Number) in the type Unrelated1 is not applicable for the arguments (Object)\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 3)\n" +
			"	* @see Unrelated1#Unrelated1(Object)\n" +
			"	                  ^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: The constructor Unrelated1(Object) is undefined\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 9)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 15)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"5. ERROR in Test.java (at line 15)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127f() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Unrelated1.java",
				"public class Unrelated1<E extends Number> {\n" +
				"	public Unrelated1(E e) {}\n" +
				"	public boolean add(E e) { return false; }\n" +
				"}\n",
				"Test.java",
				"/** \n" +
				" * @see Unrelated1#add(Number)\n" +
				" * @see Unrelated1#Unrelated1(Number)\n" +
				" *   - no warning\n" +
				" *   - method binding = Unrelated1.add(Number)\n" +
				" *   - parameter binding = java.lang.Number\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Unrelated1.java (at line 1)\n" +
			"	public class Unrelated1<E extends Number> {\n" +
			"	                        ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Test.java (at line 8)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 14)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 14)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127g() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Unrelated1.java",
				"public class Unrelated1<E extends Number> {\n" +
				"	public Unrelated1(E e) {}\n" +
				"	public boolean add(E e) { return false; }\n" +
				"}\n",
				"Test.java",
				"/** \n" +
				" * @see Unrelated1#add(Integer)\n" +
				" * @see Unrelated1#Unrelated1(Integer)\n" +
				" *   - warning = \"The method add(Object) in the type Test is not applicable for\n" +
				" *                the arguments (Integer)\"\n" +
				" *   - method binding = Unrelated1.add(Number)\n" +
				" *   - parameter binding = java.lang.Integer\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Unrelated1.java (at line 1)\n" +
			"	public class Unrelated1<E extends Number> {\n" +
			"	                        ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Unrelated1#add(Integer)\n" +
			"	                  ^^^\n" +
			"Javadoc: The method add(Number) in the type Unrelated1 is not applicable for the arguments (Integer)\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 3)\n" +
			"	* @see Unrelated1#Unrelated1(Integer)\n" +
			"	                  ^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: The constructor Unrelated1(Integer) is undefined\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 9)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 16)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"5. ERROR in Test.java (at line 16)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}
	public void testBug83127h() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"Unrelated2.java",
				"public interface Unrelated2<E> {\n" +
				"	boolean add(E e);\n" +
				"}\n",
				"Test.java",
				"/** \n" +
				" * @see Unrelated2#add(T)\n" +
				" *   - warning = \"The method add(Object) in the type Test is not applicable for\n" +
				" *                the arguments (T)\"\n" +
				" *   - method binding = Unrelated2.add(Object)\n" +
				" *   - parameter binding = T of A\n" +
				" *     -> Do we need to change this as T natually resolved to TypeVariable?\n" +
				" *        As compiler raises a warning, it\'s perhaps not a problem now...\n" +
				" */\n" +
				"public class Test<T>{\n" +
				"	Test(T t) {}\n" +
				"    public boolean add(T t) {\n" +
				"        return true;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class Sub<E extends Number> extends Test<E> {\n" +
				"	Sub (E e) {super(null);}\n" +
				"    public boolean add(E e) {\n" +
				"        if (e.doubleValue() > 0)\n" +
				"            return false;\n" +
				"        return super.add(e);\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Unrelated2.java (at line 1)\n" +
			"	public interface Unrelated2<E> {\n" +
			"	                            ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Test.java (at line 2)\n" +
			"	* @see Unrelated2#add(T)\n" +
			"	                  ^^^\n" +
			"Javadoc: The method add(Object) in the type Unrelated2 is not applicable for the arguments (T)\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 10)\n" +
			"	public class Test<T>{\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 17)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	          ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in Test.java (at line 17)\n" +
			"	class Sub<E extends Number> extends Test<E> {\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}

	/**
	 * Bug 83393: [1.5][javadoc] reference to vararg method also considers non-array type as correct
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83393"
	 */
	public void testBug83393a() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" +
				"	public void foo(int a, int b) {} \n" +
				"	public void foo(int a, int... args) {}\n" +
				"	public void foo(String... args) {}\n" +
				"	public void foo(Exception str, boolean... args) {}\n" +
				"}\n",
				"Valid.java",
				"/**\n" +
				" * @see Test#foo(int, int)\n" +
				" * @see Test#foo(int, int[])\n" +
				" * @see Test#foo(int, int...)\n" +
				" * @see Test#foo(String[])\n" +
				" * @see Test#foo(String...)\n" +
				" * @see Test#foo(Exception, boolean[])\n" +
				" * @see Test#foo(Exception, boolean...)\n" +
				" */\n" +
				"public class Valid {}\n"
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 3)\r\n" +
			"	public void foo(int a, int... args) {}\r\n" +
			"	                       ^^^^^^^^^^^\n" +
			"Syntax error, varargs are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 4)\r\n" +
			"	public void foo(String... args) {}\r\n" +
			"	                ^^^^^^^^^^^^^^\n" +
			"Syntax error, varargs are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 5)\r\n" +
			"	public void foo(Exception str, boolean... args) {}\r\n" +
			"	                               ^^^^^^^^^^^^^^^\n" +
			"Syntax error, varargs are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	public void testBug83393b() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" +
				"	public void foo(int a, int b) {} \n" +
				"	public void foo(int a, int... args) {}\n" +
				"	public void foo(String... args) {}\n" +
				"	public void foo(Exception str, boolean... args) {}\n" +
				"}\n",
				"Invalid.java",
				"/**\n" +
				" * @see Test#foo(int)\n" +
				" * @see Test#foo(int, int, int)\n" +
				" * @see Test#foo()\n" +
				" * @see Test#foo(String)\n" +
				" * @see Test#foo(String, String)\n" +
				" * @see Test#foo(Exception)\n" +
				" * @see Test#foo(Exception, boolean)\n" +
				" * @see Test#foo(Exception, boolean, boolean)\n" +
				" */\n" +
				"public class Invalid {}\n"
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 3)\n" +
			"	public void foo(int a, int... args) {}\n" +
			"	                       ^^^^^^^^^^^\n" +
			"Syntax error, varargs are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in Test.java (at line 4)\n" +
			"	public void foo(String... args) {}\n" +
			"	                ^^^^^^^^^^^^^^\n" +
			"Syntax error, varargs are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in Test.java (at line 5)\n" +
			"	public void foo(Exception str, boolean... args) {}\n" +
			"	                               ^^^^^^^^^^^^^^^\n" +
			"Syntax error, varargs are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Invalid.java (at line 2)\n" +
			"	* @see Test#foo(int)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(int, int) in the type Test is not applicable for the arguments (int)\n" +
			"----------\n" +
			"2. ERROR in Invalid.java (at line 3)\n" +
			"	* @see Test#foo(int, int, int)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(int, int) in the type Test is not applicable for the arguments (int, int, int)\n" +
			"----------\n" +
			"3. ERROR in Invalid.java (at line 4)\n" +
			"	* @see Test#foo()\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(String[]) in the type Test is not applicable for the arguments ()\n" +
			"----------\n" +
			"4. ERROR in Invalid.java (at line 5)\n" +
			"	* @see Test#foo(String)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(String[]) in the type Test is not applicable for the arguments (String)\n" +
			"----------\n" +
			"5. ERROR in Invalid.java (at line 6)\n" +
			"	* @see Test#foo(String, String)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(int, int) in the type Test is not applicable for the arguments (String, String)\n" +
			"----------\n" +
			"6. ERROR in Invalid.java (at line 7)\n" +
			"	* @see Test#foo(Exception)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(Exception, boolean[]) in the type Test is not applicable for the arguments (Exception)\n" +
			"----------\n" +
			"7. ERROR in Invalid.java (at line 8)\n" +
			"	* @see Test#foo(Exception, boolean)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(Exception, boolean[]) in the type Test is not applicable for the arguments (Exception, boolean)\n" +
			"----------\n" +
			"8. ERROR in Invalid.java (at line 9)\n" +
			"	* @see Test#foo(Exception, boolean, boolean)\n" +
			"	            ^^^\n" +
			"Javadoc: The method foo(Exception, boolean[]) in the type Test is not applicable for the arguments (Exception, boolean, boolean)\n" +
			"----------\n"
		);
	}

	/**
	 * Bug 83804: [1.5][javadoc] Missing Javadoc node for package declaration
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83804"
	 */
	public void testBug83804() {
		runNegativeTest(
			new String[] {
				"pack/package-info.java",
				"/**\n" +
				" * Valid javadoc.\n" +
				" * @see Test\n" +
				" * @see Unknown\n" +
				" * @see Test#foo()\n" +
				" * @see Test#unknown()\n" +
				" * @see Test#field\n" +
				" * @see Test#unknown\n" +
				" * @param unexpected\n" +
				" * @throws unexpected\n" +
				" * @return unexpected \n" +
				" * @deprecated accepted by javadoc.exe although javadoc 1.5 spec does not say that's a valid tag\n" +
				" * @other-tags are valid\n" +
				" */\n" +
				"package pack;\n",
				"pack/Test.java",
				"/**\n" +
				" * Invalid javadoc\n" +
				" */\n" +
				"package pack;\n" +
				"public class Test {\n" +
				"	public int field;\n" +
				"	public void foo() {}\n" +
				"}\n"
			},
			""
		);
	}

	/**
	 * Bug 86769: [javadoc] Warn/Error for 'Missing javadoc comments' doesn't recognize private inner classes
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=86769"
	 */
	public void testBug86769() {

		/* Deleted a completely meaningless test that could only serve as a torture test for the parser.
		   The test is still run in 1.5+ modes where it makes sense to run it - The test here was a nuisance
		   failing every time there is some serious grammar change that alters the semi-random behavior in
		   Diagnose Parser.
		 */
		return;
	}

	/**
	 * Bug 95286: [1.5][javadoc] package-info.java incorrectly flags "Missing comment for public declaration"
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=95286"
	 */
	public void testBug95286_Default() {
		this.reportMissingJavadocComments = CompilerOptions.ERROR;
		this.reportMissingJavadocCommentsVisibility = CompilerOptions.DEFAULT;
		runConformTest(
			new String[] {
				"test/package-info.java",
				"/**\n" +
				" * Javadoc for all package \n" +
				" */\n" +
				"package test;\n"
			}
		);
	}
	public void testBug95286_Private() {
		this.reportMissingJavadocComments = CompilerOptions.ERROR;
		this.reportMissingJavadocCommentsVisibility = CompilerOptions.PRIVATE;
		runConformTest(
			new String[] {
				"test/package-info.java",
				"/**\n" +
				" * Javadoc for all package \n" +
				" */\n" +
				"package test;\n"
			}
		);
	}

	/**
	 * Bug 95521: [1.5][javadoc] validation with @see tag not working for generic method
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=95521"
	 */
	public void testBug95521() {
		runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
				"\n" +
				"/** Test */\n" +
				"public class X implements I {\n" +
				"	/**\n" +
				"	 * @see test.I#foo(java.lang.Class)\n" +
				"	 */\n" +
				"	public <T> G<T> foo(Class<T> stuffClass) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"/** Interface */\n" +
				"interface I {\n" +
				"    /**\n" +
				"     * @param <T>\n" +
				"     * @param stuffClass \n" +
				"     * @return stuff\n" +
				"     */\n" +
				"    public <T extends Object> G<T> foo(Class<T> stuffClass);\n" +
				"}\n" +
				"/** \n" +
				" * @param <T>\n" +
				" */\n" +
				"class G<T> {}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 8)\n" +
			"	public <T> G<T> foo(Class<T> stuffClass) {\n" +
			"	        ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 8)\n" +
			"	public <T> G<T> foo(Class<T> stuffClass) {\n" +
			"	             ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in test\\X.java (at line 8)\n" +
			"	public <T> G<T> foo(Class<T> stuffClass) {\n" +
			"	                          ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in test\\X.java (at line 15)\n" +
			"	* @param <T>\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"5. ERROR in test\\X.java (at line 19)\n" +
			"	public <T extends Object> G<T> foo(Class<T> stuffClass);\n" +
			"	        ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"6. ERROR in test\\X.java (at line 19)\n" +
			"	public <T extends Object> G<T> foo(Class<T> stuffClass);\n" +
			"	                            ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"7. ERROR in test\\X.java (at line 19)\n" +
			"	public <T extends Object> G<T> foo(Class<T> stuffClass);\n" +
			"	                                         ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"8. ERROR in test\\X.java (at line 22)\n" +
			"	* @param <T>\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"9. ERROR in test\\X.java (at line 24)\n" +
			"	class G<T> {}\n" +
			"	        ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	public void testBug95521b() {
		runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
				"\n" +
				"/** Test */\n" +
				"public class X {\n" +
				"    /**\n" +
				"     * @param <T>\n" +
				"     * @param classT \n" +
				"     */\n" +
				"	public <T> X(Class<T> classT) {\n" +
				"	}\n" +
				"    /**\n" +
				"     * @param <T>\n" +
				"     * @param classT\n" +
				"     * @return classT\n" +
				"     */\n" +
				"	public <T> Class<T> foo(Class<T> classT) {\n" +
				"		return classT;\n" +
				"	}\n" +
				"}\n" +
				"/** Super class */\n" +
				"class Y extends X {\n" +
				"	/**\n" +
				"	 * @see X#X(java.lang.Class)\n" +
				"	 */\n" +
				"	public <T> Y(Class<T> classT) {\n" +
				"		super(classT);\n" +
				"	}\n" +
				"\n" +
				"	/**\n" +
				"	 * @see X#foo(java.lang.Class)\n" +
				"	 */\n" +
				"    public <T extends Object> Class<T> foo(Class<T> stuffClass) {\n" +
				"    	return null;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 6)\n" +
			"	* @param <T>\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 9)\n" +
			"	public <T> X(Class<T> classT) {\n" +
			"	        ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"3. ERROR in test\\X.java (at line 9)\n" +
			"	public <T> X(Class<T> classT) {\n" +
			"	                   ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"4. ERROR in test\\X.java (at line 12)\n" +
			"	* @param <T>\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"5. ERROR in test\\X.java (at line 16)\n" +
			"	public <T> Class<T> foo(Class<T> classT) {\n" +
			"	        ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"6. ERROR in test\\X.java (at line 16)\n" +
			"	public <T> Class<T> foo(Class<T> classT) {\n" +
			"	                 ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"7. ERROR in test\\X.java (at line 16)\n" +
			"	public <T> Class<T> foo(Class<T> classT) {\n" +
			"	                              ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"8. ERROR in test\\X.java (at line 25)\n" +
			"	public <T> Y(Class<T> classT) {\n" +
			"	        ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"9. ERROR in test\\X.java (at line 25)\n" +
			"	public <T> Y(Class<T> classT) {\n" +
			"	                   ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"10. ERROR in test\\X.java (at line 25)\n" +
			"	public <T> Y(Class<T> classT) {\n" +
			"	                      ^^^^^^\n" +
			"Javadoc: Missing tag for parameter classT\n" +
			"----------\n" +
			"11. ERROR in test\\X.java (at line 32)\n" +
			"	public <T extends Object> Class<T> foo(Class<T> stuffClass) {\n" +
			"	        ^^^^^^^^^^^^^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"12. ERROR in test\\X.java (at line 32)\n" +
			"	public <T extends Object> Class<T> foo(Class<T> stuffClass) {\n" +
			"	                                ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"13. ERROR in test\\X.java (at line 32)\n" +
			"	public <T extends Object> Class<T> foo(Class<T> stuffClass) {\n" +
			"	                                             ^\n" +
			"Syntax error, parameterized types are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}

	/**
	 * Bug 96237: [javadoc] Inner types must be qualified
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=96237"
	 */
	public void testBug96237_Public01() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runConformTest(
			new String[] {
				"comment6/Valid.java",
				"package comment6;\n" +
				"public class Valid {\n" +
				"    /**\n" +
				"     * @see Valid.Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n" +
				"/**\n" +
				" * See also {@link Valid.Inner}\n" +
				" */\n" +
				"class Sub2 extends Valid { }"
			}
		);
	}
	public void testBug96237_Public02() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"comment6/Invalid.java",
				"package comment6;\n" +
				"public class Invalid {\n" +
				"    /**\n" +
				"     * @see Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n" +
				"/**\n" +
				" * See also {@link Inner} \n" +
				" */\n" +
				"class Sub1 extends Invalid { }\n"
			},
			//comment6\Invalid.java:6: warning - Tag @see: reference not found: Inner
			"----------\n" +
			"1. ERROR in comment6\\Invalid.java (at line 4)\r\n" +
			"	* @see Inner\r\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug96237_Public03() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"comment6a/def/Test.java",
				"package comment6a.def;\n" +
				"public class Test {\n" +
				"    /**\n" +
				"     * @see Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n",
				"comment6a/test/Invalid.java",
				"package comment6a.test;\n" +
				"import comment6a.def.Test;\n" +
				"/**\n" +
				" * See also {@link Inner}\n" +
				" */\n" +
				"public class Invalid extends Test { \n" +
				"}",
				"comment6a/test/Invalid2.java",
				"package comment6a.test;\n" +
				"import comment6a.def.Test;\n" +
				"/**\n" +
				" * @see Test.Inner\n" +
				" */\n" +
				"public class Invalid2 extends Test { \n" +
				"}",
				"comment6a/test/Valid.java",
				"package comment6a.test;\n" +
				"import comment6a.def.Test;\n" +
				"/**\n" +
				" * @see comment6a.def.Test.Inner\n" +
				" */\n" +
				"public class Valid extends Test { \n" +
				"}"
			},
			//comment6a\def\Test.java:6: warning - Tag @see: reference not found: Inner
			//comment6a\test\Invalid.java:8: warning - Tag @link: reference not found: Inner
			//comment6a\test\Invalid2.java:8: warning - Tag @see: reference not found: Test.Inner => bug ID: 4464323
			"----------\n" +
			"1. ERROR in comment6a\\def\\Test.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in comment6a\\test\\Invalid.java (at line 4)\n" +
			"	* See also {@link Inner}\n" +
			"	                  ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in comment6a\\test\\Invalid2.java (at line 4)\n" +
			"	* @see Test.Inner\n" +
			"	       ^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug96237_Public04() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"comment6b/Invalid.java",
				"package comment6b;\n" +
				"\n" +
				"/**\n" +
				" * @see Inner\n" +
				" */\n" +
				"public class Invalid implements Test { \n" +
				"}",
				"comment6b/Test.java",
				"package comment6b;\n" +
				"public interface Test {\n" +
				"    /**\n" +
				"     * @see Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n",
				"comment6b/Valid.java",
				"package comment6b;\n" +
				"\n" +
				"/**\n" +
				" * @see Test.Inner\n" +
				" */\n" +
				"public class Valid implements Test { \n" +
				"}"
			},
			//comment6b\Test.java:6: warning - Tag @see: reference not found: Inner
			//comment6b\Invalid.java:6: warning - Tag @see: reference not found: Inner
			"----------\n" +
			"1. ERROR in comment6b\\Invalid.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in comment6b\\Test.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug96237_Public05() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test/a/Test.java",
				"package test.a;\n" +
				"/**\n" +
				" * @see Inner\n" +
				" * @see Test.Inner\n" +
				" */\n" +
				"public class Test {\n" +
				"	class Inner {}\n" +
				"}\n"
			},
			//test\a\Test.java:6: warning - Tag @see: reference not found: Inner
			//test\a\Test.java:6: warning - Tag @see: reference not found: Test.Inner
			"----------\n" +
			"1. ERROR in test\\a\\Test.java (at line 3)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"2. ERROR in test\\a\\Test.java (at line 4)\n" +
			"	* @see Test.Inner\n" +
			"	       ^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n"
		);
	}
	public void testBug96237_Public06() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test/b/Test.java",
				"package test.b;\n" +
				"/** \n" +
				" * @see Inner.Level2\n" +
				" * @see Test.Inner.Level2\n" +
				" */\n" +
				"public class Test {\n" +
				"	/** \n" +
				"	 * @see Level2\n" +
				"	 * @see Test.Inner.Level2\n" +
				"	 */\n" +
				"	public class Inner {\n" +
				"		class Level2 {}\n" +
				"	}\n" +
				"}\n"
			},
			//test\b\Test.java:6: warning - Tag @see: reference not found: Inner.Level2
			//test\b\Test.java:6: warning - Tag @see: reference not found: Test.Inner.Level2
			//test\b\Test.java:11: warning - Tag @see: reference not found: Level2
			//test\b\Test.java:11: warning - Tag @see: reference not found: Test.Inner.Level2
			"----------\n" +
			"1. ERROR in test\\b\\Test.java (at line 3)\n" +
			"	* @see Inner.Level2\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"2. ERROR in test\\b\\Test.java (at line 4)\n" +
			"	* @see Test.Inner.Level2\n" +
			"	       ^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"3. ERROR in test\\b\\Test.java (at line 8)\n" +
			"	* @see Level2\n" +
			"	       ^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"4. ERROR in test\\b\\Test.java (at line 9)\n" +
			"	* @see Test.Inner.Level2\n" +
			"	       ^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n"
		);
	}
	public void testBug96237_Public07() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test/c/Test.java",
				"package test.c;\n" +
				"/**\n" +
				" * @see Inner.Level2.Level3\n" +
				" * @see Test.Inner.Level2.Level3\n" +
				" */\n" +
				"public class Test {\n" +
				"	public class Inner {\n" +
				"		/**\n" +
				"		 * @see Level3\n" +
				"		 * @see Level2.Level3\n" +
				"		 * @see Inner.Level2.Level3\n" +
				"		 * @see Test.Inner.Level2.Level3\n" +
				"		 */\n" +
				"		public class Level2 {\n" +
				"			class Level3 {\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			//test\c\Test.java:6: warning - Tag @see: reference not found: Inner.Level2.Level3
			//test\c\Test.java:6: warning - Tag @see: reference not found: Test.Inner.Level2.Level3
			//test\c\Test.java:14: warning - Tag @see: reference not found: Level3
			//test\c\Test.java:14: warning - Tag @see: reference not found: Level2.Level3
			//test\c\Test.java:14: warning - Tag @see: reference not found: Inner.Level2.Level3
			//test\c\Test.java:14: warning - Tag @see: reference not found: Test.Inner.Level2.Level3
			"----------\n" +
			"1. ERROR in test\\c\\Test.java (at line 3)\n" +
			"	* @see Inner.Level2.Level3\n" +
			"	       ^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"2. ERROR in test\\c\\Test.java (at line 4)\n" +
			"	* @see Test.Inner.Level2.Level3\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"3. ERROR in test\\c\\Test.java (at line 9)\n" +
			"	* @see Level3\n" +
			"	       ^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"4. ERROR in test\\c\\Test.java (at line 10)\n" +
			"	* @see Level2.Level3\n" +
			"	       ^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"5. ERROR in test\\c\\Test.java (at line 11)\n" +
			"	* @see Inner.Level2.Level3\n" +
			"	       ^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"6. ERROR in test\\c\\Test.java (at line 12)\n" +
			"	* @see Test.Inner.Level2.Level3\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n"
		);
	}
	public void testBug96237_Public08() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test/d/Reference.java",
				"package test.d;\n" +
				"class Reference {\n" +
				"}\n",
				"test/d/Test.java",
				"package test.d;\n" +
				"/**\n" +
				" * @see Secondary\n" +
				" * @see Reference\n" +
				" */\n" +
				"public class Test {\n" +
				"}\n" +
				"class Secondary {}"
			},
			"----------\n" +
			"1. ERROR in test\\d\\Test.java (at line 3)\n" +
			"	* @see Secondary\n" +
			"	       ^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n" +
			"2. ERROR in test\\d\\Test.java (at line 4)\n" +
			"	* @see Reference\n" +
			"	       ^^^^^^^^^\n" +
			"Javadoc: 'public' visibility for malformed doc comments hides this 'default' reference\n" +
			"----------\n"
		);
	}
	public void testBug96237_Private01() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runConformTest(
			new String[] {
				"comment6/Valid.java",
				"package comment6;\n" +
				"public class Valid {\n" +
				"    /**\n" +
				"     * @see Valid.Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n" +
				"/**\n" +
				" * See also {@link Valid.Inner}\n" +
				" */\n" +
				"class Sub2 extends Valid { }"
			}
		);
	}
	public void testBug96237_Private02() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runNegativeTest(
			new String[] {
				"comment6/Invalid.java",
				"package comment6;\n" +
				"public class Invalid {\n" +
				"    /**\n" +
				"     * @see Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n" +
				"/**\n" +
				" * See also {@link Inner} \n" +
				" */\n" +
				"class Sub1 extends Invalid { }\n"
			},
			//comment6\Invalid.java:6: warning - Tag @see: reference not found: Inner
			//comment6\Invalid.java:11: warning - Tag @link: reference not found: Inner
			"----------\n" +
			"1. ERROR in comment6\\Invalid.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"2. ERROR in comment6\\Invalid.java (at line 9)\n" +
			"	* See also {@link Inner} \n" +
			"	                  ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug96237_Private03() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runNegativeTest(
			new String[] {
				"comment6a/def/Test.java",
					"package comment6a.def;\n" +
				"public class Test {\n" +
				"    /**\n" +
				"     * @see Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n",
				"comment6a/test/Invalid.java",
				"package comment6a.test;\n" +
				"import comment6a.def.Test;\n" +
				"/**\n" +
				" * See also {@link Inner}\n" +
				" */\n" +
				"public class Invalid extends Test { \n" +
				"}",
				"comment6a/test/Invalid2.java",
				"package comment6a.test;\n" +
				"import comment6a.def.Test;\n" +
				"/**\n" +
				" * @see Test.Inner\n" +
				" */\n" +
				"public class Invalid2 extends Test { \n" +
				"}",
				"comment6a/test/Valid.java",
				"package comment6a.test;\n" +
				"import comment6a.def.Test;\n" +
				"/**\n" +
				" * @see comment6a.def.Test.Inner\n" +
				" */\n" +
				"public class Valid extends Test { \n" +
				"}"
			},
			//comment6a\def\Test.java:6: warning - Tag @see: reference not found: Inner
			//comment6a\test\Invalid.java:8: warning - Tag @link: reference not found: Inner
			//comment6a\test\Invalid2.java:8: warning - Tag @see: reference not found: Test.Inner => bug ID: 4464323
			"----------\n" +
			"1. ERROR in comment6a\\def\\Test.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in comment6a\\test\\Invalid.java (at line 4)\n" +
			"	* See also {@link Inner}\n" +
			"	                  ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in comment6a\\test\\Invalid2.java (at line 4)\n" +
			"	* @see Test.Inner\n" +
			"	       ^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug96237_Private04() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runNegativeTest(
			new String[] {
				"comment6b/Invalid.java",
				"package comment6b;\n" +
				"\n" +
				"/**\n" +
				" * @see Inner\n" +
				" */\n" +
				"public class Invalid implements Test { \n" +
				"}",
				"comment6b/Test.java",
				"package comment6b;\n" +
				"public interface Test {\n" +
				"    /**\n" +
				"     * @see Inner\n" +
				"     */\n" +
				"    public class Inner { }\n" +
				"}\n",
				"comment6b/Valid.java",
				"package comment6b;\n" +
				"\n" +
				"/**\n" +
				" * @see Test.Inner\n" +
				" */\n" +
				"public class Valid implements Test { \n" +
				"}"
			},
			//comment6b\Invalid.java:6: warning - Tag @see: reference not found: Inner
			//comment6b\Test.java:6: warning - Tag @see: reference not found: Inner
			"----------\n" +
			"1. ERROR in comment6b\\Invalid.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in comment6b\\Test.java (at line 4)\n" +
			"	* @see Inner\n" +
			"	       ^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug96237_Private05() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runConformTest(
			new String[] {
				"test/a/Test.java",
				"package test.a;\n" +
				"/**\n" +
				" * @see Inner\n" +
				" * @see Test.Inner\n" +
				" */\n" +
				"public class Test {\n" +
				"	class Inner {}\n" +
				"}\n"
			}
		);
	}
	public void testBug96237_Private06() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runConformTest(
			new String[] {
				"test/b/Test.java",
				"package test.b;\n" +
				"/** \n" +
				" * @see Inner.Level2\n" +
				" * @see Test.Inner.Level2\n" +
				" */\n" +
				"public class Test {\n" +
				"	/** \n" +
				"	 * @see Level2\n" +
				"	 * @see Test.Inner.Level2\n" +
				"	 */\n" +
				"	public class Inner {\n" +
				"		class Level2 {}\n" +
				"	}\n" +
				"}\n"
			}
		);
	}
	public void testBug96237_Private07() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runConformTest(
			new String[] {
				"test/c/Test.java",
				"package test.c;\n" +
				"/**\n" +
				" * @see Inner.Level2.Level3\n" +
				" * @see Test.Inner.Level2.Level3\n" +
				" */\n" +
				"public class Test {\n" +
				"	public class Inner {\n" +
				"		/**\n" +
				"		 * @see Level3\n" +
				"		 * @see Level2.Level3\n" +
				"		 * @see Inner.Level2.Level3\n" +
				"		 * @see Test.Inner.Level2.Level3\n" +
				"		 */\n" +
				"		public class Level2 {\n" +
				"			class Level3 {\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			}
		);
	}
	public void testBug96237_Private08() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PRIVATE;
		runConformTest(
			new String[] {
				"test/d/Reference.java",
				"package test.d;\n" +
				"class Reference {\n" +
				"}\n",
				"test/d/Test.java",
				"package test.d;\n" +
				"/**\n" +
				" * @see Secondary\n" +
				" * @see Reference\n" +
				" */\n" +
				"public class Test {\n" +
				"}\n" +
				"class Secondary {}"
			}
		);
	}

	/**
	 * Bug 101283: [1.5][javadoc] Javadoc validation raises missing implementation in compiler
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=101283"
	 */
	public void testBug101283a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T, F> {\n" +
				"\n" +
				"	/**\n" +
				"	 * @param <T>  \n" +
				"	 * @param <F>\n" +
				"	 */\n" +
				"	static class Entry<L, R> {\n" +
				"		// empty\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T, F> {\n" +
			"	               ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	* @param <T>  \n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	* @param <F>\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	static class Entry<L, R> {\n" +
			"	                   ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	public void testBug101283b() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T, F> {\n" +
				"\n" +
				"	/**\n" +
				"	 * @see T Variable \n" +
				"	 * @see F Variable\n" +
				"	 */\n" +
				"	static class Entry<L, R> {\n" +
				"		// empty\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T, F> {\n" +
			"	               ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	* @see T Variable \n" +
			"	       ^\n" +
			"Javadoc: Invalid reference\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	* @see F Variable\n" +
			"	       ^\n" +
			"Javadoc: Invalid reference\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	static class Entry<L, R> {\n" +
			"	                   ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	public void testBug101283c() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T, F> {\n" +
				"\n" +
				"	/**\n" +
				"	 * @param <T>  \n" +
				"	 * @param <F>\n" +
				"	 */\n" +
				"	class Entry<L, R> {\n" +
				"		// empty\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T, F> {\n" +
			"	               ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	* @param <T>  \n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	* @param <F>\n" +
			"	         ^^^\n" +
			"Javadoc: Invalid param tag name\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	class Entry<L, R> {\n" +
			"	            ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	public void testBug101283d() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T, F> {\n" +
				"\n" +
				"	/**\n" +
				"	 * @see T Variable \n" +
				"	 * @see F Variable\n" +
				"	 */\n" +
				"	class Entry<L, R> {\n" +
				"		// empty\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T, F> {\n" +
			"	               ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	* @see T Variable \n" +
			"	       ^\n" +
			"Javadoc: Invalid reference\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	* @see F Variable\n" +
			"	       ^\n" +
			"Javadoc: Invalid reference\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	class Entry<L, R> {\n" +
			"	            ^^^^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	public void testBug101283e() {
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" +
				" * @see #foo()\n" +
				" */\n" +
				"public interface X<T> {\n" +
				"\n" +
				"	public T foo();\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	public interface X<T> {\n" +
			"	                   ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
	// Verify that ProblemReasons.InheritedNameHidesEnclosingName is not reported as Javadoc error
	public void testBug101283g() {
		this.reportMissingJavadocTags = CompilerOptions.DISABLED;
		runConformTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
				"public class X {\n" +
				"	int foo() { return 0; }\n" +
				"	class XX extends X2 {\n" +
				"		int bar() {\n" +
				"			return foo();\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"class X2 {\n" +
				"	int foo() {\n" +
				"		return 0;\n" +
				"	}\n" +
				"}\n",
				"test/Y.java",
				"package test;\n" +
				"public class Y {\n" +
				"	int foo;\n" +
				"	class YY extends Y2 {\n" +
				"	/**\n" +
				"	 *  @see #foo\n" +
				"	 */\n" +
				"		int bar() {\n" +
				"			return foo;\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"class Y2 {\n" +
				"	int foo;\n" +
				"}\n"
			}
		);
	}

	/**
	 * Bug 112346: [javadoc] {&#064;inheritedDoc} should be inactive for non-overridden method
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=112346"
	 */
	public void testBug112346() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"/**\n" +
				" * Test references\n" +
				" * @see Test#field\n" +
				" * @see Test#foo()\n" +
				" */\n" +
				"public class Test<T> {\n" +
				"	T field;\n" +
				"	T foo() { return null; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 6)\n" +
			"	public class Test<T> {\n" +
			"	                  ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n");
	}

	/**
	 * Bug 119857: [javadoc] Some inner class references should be flagged as unresolved
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=119857"
	 */
	public void testBug119857() {
		runNegativeTest(
			new String[] {
				"DefaultInformationControl.java",
				"public class DefaultInformationControl {\n" +
				"	public interface IInformationPresenter {\n" +
				"		/**\n" +
				"		 * Updates the given presentation of the given information and\n" +
				"		 * thereby may manipulate the information to be displayed. The manipulation\n" +
				"		 * could be the extraction of textual encoded style information etc. Returns the\n" +
				"		 * manipulated information.\n" +
				"		 *\n" +
				"		 * @param hoverInfo the information to be presented\n" +
				"		 * @param maxWidth the maximal width in pixels\n" +
				"		 * @param maxHeight the maximal height in pixels\n" +
				"		 *\n" +
				"		 * @return the manipulated information\n" +
				"		 * @deprecated As of 3.2, replaced by {@link IInformationPresenterExtension#updatePresentation(String, int, int)}\n" +
				"		 * 				see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=38528 for details.\n" +
				"		 */\n" +
				"		String updatePresentation(String hoverInfo, int maxWidth, int maxHeight);\n" +
				"	}\n" +
				"	/**\n" +
				"	 * An information presenter determines the style presentation\n" +
				"	 * of information displayed in the default information control.\n" +
				"	 * The interface can be implemented by clients.\n" +
				"	 * \n" +
				"	 * @since 3.2\n" +
				"	 */\n" +
				"	public interface IInformationPresenterExtension {\n" +
				"		\n" +
				"		/**\n" +
				"		 * Updates the given presentation of the given information and\n" +
				"		 * thereby may manipulate the information to be displayed. The manipulation\n" +
				"		 * could be the extraction of textual encoded style information etc. Returns the\n" +
				"		 * manipulated information.\n" +
				"		 * <p>\n" +
				"		 * Replaces {@link IInformationPresenter#updatePresentation(String, int, int)}\n" +
				"		 * <em>Make sure that you do not pass in a <code>Display</code></em> until\n" +
				"		 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=38528 is fixed.\n" +
				"		 * </p>\n" +
				"		 *\n" +
				"		 * @param hoverInfo the information to be presented\n" +
				"		 * @param maxWidth the maximal width in pixels\n" +
				"		 * @param maxHeight the maximal height in pixels\n" +
				"		 *\n" +
				"		 * @return the manipulated information\n" +
				"		 */\n" +
				"		String updatePresentation(String hoverInfo, int maxWidth, int maxHeight);\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in DefaultInformationControl.java (at line 14)\n" +
			"	* @deprecated As of 3.2, replaced by {@link IInformationPresenterExtension#updatePresentation(String, int, int)}\n" +
			"	                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"2. ERROR in DefaultInformationControl.java (at line 34)\n" +
			"	* Replaces {@link IInformationPresenter#updatePresentation(String, int, int)}\n" +
			"	                  ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug119857_Fields() {
		runNegativeTest(
			new String[] {
				"TestFields.java",
				"/**\n" +
				" * @see MyInnerClass#foo\n" +
				" */\n" +
				"public class TestFields {\n" +
				"    /**\n" +
				"     * @see MyInnerClass#foo\n" +
				"     */\n" +
				"    public class MyInnerClass {\n" +
				"            Object foo;\n" +
				"    }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in TestFields.java (at line 6)\n" +
			"	* @see MyInnerClass#foo\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug119857_Methods() {
		runNegativeTest(
			new String[] {
				"TestMethods.java",
				"/**\n" +
				" * @see MyInnerClass#foo()\n" +
				" * @see MyInnerInterface#foo()\n" +
				" */\n" +
				"public class TestMethods {\n" +
				"    /**\n" +
				"     * @see MyInnerInterface#foo()\n" +
				"     */\n" +
				"    public class MyInnerClass {\n" +
				"            public void foo() {}\n" +
				"    }\n" +
				"    /**\n" +
				"     * @see MyInnerClass#foo()\n" +
				"     */\n" +
				"    public interface MyInnerInterface {\n" +
				"            public void foo();\n" +
				"    }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in TestMethods.java (at line 7)\n" +
			"	* @see MyInnerInterface#foo()\n" +
			"	       ^^^^^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"2. ERROR in TestMethods.java (at line 13)\n" +
			"	* @see MyInnerClass#foo()\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug119857_Types() {
		runNegativeTest(
			new String[] {
				"TestTypes.java",
				"/**\n" +
				" * @see MyInnerClass\n" +
				" * @see MyInnerInterface\n" +
				" */\n" +
				"public class TestTypes {\n" +
				"	/**\n" +
				"	 * @see MyInnerInterface\n" +
				"	 */\n" +
				"	public class MyInnerClass {\n" +
				"	        public void foo() {}\n" +
				"	}\n" +
				"	/**\n" +
				"	 * @see MyInnerClass\n" +
				"	 */\n" +
				"	public interface MyInnerInterface {\n" +
				"	        public void foo();\n" +
				"	}\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in TestTypes.java (at line 7)\n" +
			"	* @see MyInnerInterface\n" +
			"	       ^^^^^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n" +
			"2. ERROR in TestTypes.java (at line 13)\n" +
			"	* @see MyInnerClass\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug119857_Private01() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runConformTest(
			new String[] {
				"pack/Test.java",
				"package pack;\n" +
				"public class Test {\n" +
				"	static class Inner {\n" +
				"		public Object foo() { return null; }\n" +
				"	}\n" +
				"	public Inner field;\n" +
				"	/** \n" +
				"	 * @see Inner#foo()\n" +
				"	 */\n" +
				"	public Object foo() {\n" +
				"		return field.foo();\n" +
				"	}\n" +
				"}\n"
			}
		);
	}
	public void testBug119857_Public01() {
		this.reportMissingJavadocTags = CompilerOptions.DISABLED;
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"pack/Test.java",
				"package pack;\n" +
				"public class Test {\n" +
				"	static class Inner {\n" +
				"		public Object foo() { return null; }\n" +
				"	}\n" +
				"	public Inner field;\n" +
				"	/** \n" +
				"	 * @see Inner#foo()\n" +
				"	 */\n" +
				"	public Object foo() {\n" +
				"		return field.foo();\n" +
				"	}\n" +
				"}\n"
			},
			//pack/Test.java:13: warning - Tag @see: reference not found: Inner1#foo()
			"----------\n" +
			"1. ERROR in pack\\Test.java (at line 8)\r\n" +
			"	* @see Inner#foo()\r\n" +
			"	       ^^^^^\n" +
			"Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" +
			"----------\n"
		);
	}
	public void testBug119857_Private02() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"test/Test.java",
				"package test;\n" +
				"public class Test {\n" +
				"	static class Inner1 {\n" +
				"		public Object foo() { return null; }\n" +
				"	}\n" +
				"	static class Inner2 {\n" +
				"		public Inner1 field;\n" +
				"		/** \n" +
				"		 * @see Inner1#foo()\n" +
				"		 */\n" +
				"		public Object foo() {\n" +
				"			return field.foo();\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			//pack\Test2.java:11: warning - Tag @see: reference not found: Inner1#foo()
			"----------\n" +
			"1. ERROR in test\\Test.java (at line 9)\r\n" +
			"	* @see Inner1#foo()\r\n" +
			"	       ^^^^^^\n" +
			"Javadoc: Invalid member type qualification\n" +
			"----------\n"
		);
	}
	public void testBug119857_Public02() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runConformTest(
			new String[] {
				"test/Test.java",
				"package test;\n" +
				"public class Test {\n" +
				"	static class Inner1 {\n" +
				"		public Object foo() { return null; }\n" +
				"	}\n" +
				"	static class Inner2 {\n" +
				"		public Inner1 field;\n" +
				"		/** \n" +
				"		 * @see Inner1#foo()\n" +
				"		 */\n" +
				"		public Object foo() {\n" +
				"			return field.foo();\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			}
		);
	}
	public void testBug119857_Public03() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"pack/Test.java",
				"package pack;\n" +
				"public class Test {\n" +
				"	static class Inner1 {\n" +
				"		public Object foo() { return null; }\n" +
				"	}\n" +
				"	public static class Inner2 {\n" +
				"		public Inner1 field;\n" +
				"		/** \n" +
				"		 * @see Inner1#foo()\n" +
				"		 */\n" +
				"		public Object foo() {\n" +
				"			return field.foo();\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			//pack/Test.java:13: warning - Tag @see: reference not found: Inner1#foo()
			"----------\n" +
			"1. ERROR in pack\\Test.java (at line 9)\n" +
			"	* @see Inner1#foo()\n" +
			"	       ^^^^^^\n" +
			"Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" +
			"----------\n"
		);
	}

	/**
	 * Bug 145007: [1.5][javadoc] Generics + Inner Class -> Javadoc "missing @throws" warning
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=145007"
	 */
	public void testBug145007() {
		runNegativeTest(
			new String[] {
				"TestClass.java",
				"class TestClass<T> {\n" +
				"    static class Test1 {\n" +
				"        /**\n" +
				"         * A simple method that demonstrates tag problems\n" +
				"         * \n" +
				"         * @return a string\n" +
				"         * @throws MyException\n" +
				"         *             if something goes wrong\n" +
				"         */\n" +
				"        public String getString() throws MyException {\n" +
				"            throw new MyException();\n" +
				"        }\n" +
				"    }\n" +
				"\n" +
				"    static class MyException extends Exception {\n" +
				"        private static final long serialVersionUID = 1L;\n" +
				"    }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in TestClass.java (at line 1)\r\n" +
			"	class TestClass<T> {\r\n" +
			"	                ^\n" +
			"Syntax error, type parameters are only available if source level is 1.5 or greater\n" +
			"----------\n"
		);
	}
}
