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

import java.util.Map;

import junit.framework.Test;

import org.eclipse.wst.jsdt.internal.compiler.impl.CompilerOptions;

public class JavadocBugsTest extends JavadocTest {

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

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

	public static Class javadocTestClass() {
		return JavadocBugsTest.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 = "testBug96237";
//		TESTS_NAMES = new String[] { "testBug68017javadocWarning2" };
//		TESTS_NUMBERS = new int[] { 129241 };
//		TESTS_RANGE = new int[] { 21, 50 };
	}
	public static Test suite() {
		return buildAllCompliancesTestSuite(javadocTestClass());
	}

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

	/**
	 * Bug 45596.
	 * When this bug happened, compiler wrongly complained on missing parameter javadoc
	 * entries for method declaration in anonymous class.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45596">45596</a>
	 */
	public void testBug45596() {
		runConformTest(
			new String[] {
				"test/X.java",
				"package test;\n"
			 	+ "class X {\n"
					+ "	void foo(int x, String str) {}\n"
			  		+ "}\n",
				"test/Y.java",
				"package test;\n"
			   		+ "class Y {\n"
			   		+ "  /** */\n"
			   		+ "  protected X field = new X() {\n"
			   		+ "    void foo(int x, String str) {}\n"
			   		+ "  };\n"
			   		+ "}\n"});
	}

	/**
	 * Additional test for bug 45596.
	 * Verify correct complain about missing parameter javadoc entries in anonymous class.
	 * Since bug 47132, @param, @return and @throws tags are not resolved in javadoc of anonymous
	 * class...
	 */
	public void testBug45596a() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	void foo(int x, String str) {}\n" + 
				"}\n",
				"Y1.java",
				"public class Y1 {\n" + 
				"	/** */\n" +
				"	protected X field = new X() {\n" + 
				"		/** Invalid javadoc comment in anonymous class */\n" + 
				"		void foo(String str) {}\n" + 
				"	};\n" + 
				"}\n",
				"Y2.java",
				"public class Y2 {\n" + 
				"	/** */\n" + 
				"	void foo() {\n" + 
				"		X x = new X() {\n" + 
				"			/** Invalid javadoc comment in anonymous class */\n" + 
				"			void foo(String str) {}\n" + 
				"		};\n" + 
				"		x.foo(0, \"\");\n" + 
				"	}\n" + 
				"}\n",
				"Y3.java",
				"public class Y3 {\n" + 
				"	static X x;\n" + 
				"	static {\n" + 
				"		x = new X() {\n" + 
				"			/** Invalid javadoc comment in anonymous class */\n" + 
				"			void foo(String str) {}\n" + 
				"		};\n" + 
				"	}\n" + 
				"}\n" }
			);
	}

	/**
	 * Additional test for bug 45596.
	 * Verify no complain about missing parameter javadoc entries.
	 */
	public void testBug45596b() {
		runConformTest(
			new String[] {
		"X.java",
		"public class X {\n" + 
		"	void foo(int x, String str) {}\n" + 
		"}\n",
		"Y1.java",
		"public class Y1 {\n" + 
		"	/** */\n" + 
		"	protected X field = new X() {\n" + 
		"		/**\n" + 
		"		 * Valid javadoc comment in anonymous class.\n" + 
		"		 * @param str String\n" + 
		"		 * @return int\n" + 
		"		 */\n" + 
		"		int bar(String str) {\n" + 
		"			return 10;\n" + 
		"		}\n" + 
		"	};\n" + 
		"}\n",
		"Y2.java",
		"public class Y2 {\n" + 
		"	/** */\n" + 
		"	void foo() {\n" + 
		"		X x = new X() {\n" + 
		"			/**\n" + 
		"			 * Valid javadoc comment in anonymous class.\n" + 
		"			 * @param str String\n" + 
		"			 * @return int\n" + 
		"			 */\n" + 
		"			int bar(String str) {\n" + 
		"				return 10;\n" + 
		"			}\n" + 
		"		};\n" + 
		"		x.foo(0, \"\");\n" + 
		"	}\n" + 
		"}\n",
		"Y3.java",
		"public class Y3 {\n" + 
		"	static X x;\n" + 
		"	static {\n" + 
		"		x = new X() {\n" + 
		"			/**\n" + 
		"			 * Valid javadoc comment in anonymous class.\n" + 
		"			 * @param str String\n" + 
		"			 * @return int\n" + 
		"			 */\n" + 
		"			int bar(String str) {\n" + 
		"				return 10;\n" + 
		"			}\n" + 
		"		};\n" + 
		"	}\n" + 
		"}\n"}
			);
	}

	/**
	 * Bug 45592.
	 * When this bug happened, a NullPointerException occured during the compilation.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45592">45592</a>
	 */
	public void testBug45592() {
		runConformTest(
			new String[] {
				"a/Y.java",
				"package a;\n" + 
				"\n" + 
				"/** */\n" + 
				"public class Y {\n" + 
				"	protected boolean bar(Object obj) {\n" + 
				"		return obj == null;\n" + 
				"	}\n" + 
				"}\n",
				"test/X.java",
				"package test;\n" + 
				"public class X {\n" + 
				"	public static Boolean valueOf(boolean bool) {\n" + 
				"		if (bool) {\n" + 
				"			return Boolean.TRUE;\n" + 
				"		} else {\n" + 
				"			return Boolean.FALSE;\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test/YY.java",
				"package test;\n" + 
				"\n" + 
				"import a.Y;\n" + 
				"\n" + 
				"/** */\n" + 
				"public class YY extends Y {\n" + 
				"	/**\n" + 
				"	 * Returns a Boolean.\n" + 
				"	 * @param key\n" + 
				"	 * @return A Boolean telling whether the key is null or not.\n" + 
				"	 * @see #bar(Object)\n" + 
				"	 */\n" + 
				"	protected Boolean foo(Object key) {\n" + 
				"		return X.valueOf(bar(key));\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 45737.
	 * When this bug happened, compiler complains on return type and argument of method bar.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45737">45737</a>
	 */
	public void testBug45737() {
		runConformTest(
			new String[] {
				"Y.java",
				"class Y {\n" + 
				"	void foo() {\n" + 
				"		X x = new X() {\n" + 
				"			/**\n" + 
				"			 * Valid javadoc comment in anonymous class.\n" + 
				"			 * @param str String\n" + 
				"			 * @return int\n" + 
				"			 */\n" + 
				"			int bar(String str) {\n" + 
				"				return 10;\n" + 
				"			}\n" + 
				"		};\n" + 
				"		x.foo();\n" + 
				"	}\n" + 
				"}\n",
				"X.java",
				"class X {\n" + 
				"	void foo() {}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 45669.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45669">45669</a>
	 */
	public void testBug45669() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * Valid javadoc comment with tags mixed order\n" + 
				"	 * @param str first param\n" + 
				"	 * 		@see String\n" + 
				"	 * @param dbl second param\n" + 
				"	 * 		@see Double\n" + 
				"	 * 		also\n" + 
				"	 * 		@see \"String ref\"\n" + 
				"	 * @return int\n" + 
				"	 * @throws InterruptedException\n" + 
				"	 * \n" + 
				"	 */\n" + 
				"	int foo(String str, Double dbl) throws InterruptedException {\n" + 
				"		return 0;\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}
	/*
	 * Additional test for bug 45669.
	 * Verify that compiler complains when @throws tag is between @param tags.
	 */
	public void testBug45669a() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * Javadoc comment with tags invalid mixed order\n" + 
				"	 * @param str first param\n" + 
				"	 * 		@see String\n" + 
				"	 * @throws InterruptedException\n" + 
				"	 * @param dbl second param\n" + 
				"	 * 		@see Double\n" + 
				"	 * 		also\n" + 
				"	 * 		@see \"String ref\"\n" + 
				"	 * @return int\n" + 
				"	 * \n" + 
				"	 */\n" + 
				"	public int foo(String str, Double dbl) throws InterruptedException {\n" + 
				"		return 0;\n" + 
				"	}\n" + 
				"}\n"
			},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	* @param dbl second param\n" + 
		"	   ^^^^^\n" + 
		"Javadoc: Unexpected tag\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 14)\n" + 
		"	public int foo(String str, Double dbl) throws InterruptedException {\n" + 
		"	                                  ^^^\n" + 
		"Javadoc: Missing tag for parameter dbl\n" + 
		"----------\n"
		);
	}

	/**
	 * Bug 45958.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45958">45958</a>
	 */
	public void testBug45958() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	int x;\n" + 
				"	public X(int i) {\n" + 
				"		x = i;\n" + 
				"	}\n" + 
				"	/**\n" + 
				"	 * @see #X(int)\n" + 
				"	 */\n" + 
				"	void foo() {\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}
	public void testBug45958a() {
		runNegativeTest(
			new String[] {
			   "X.java",
		   		"public class X {\n" + 
		   		"	int x;\n" + 
		   		"	public X(int i) {\n" + 
		   		"		x = i;\n" + 
		   		"	}\n" + 
		   		"	/**\n" + 
		   		"	 * @see #X(String)\n" + 
		   		"	 */\n" + 
		   		"	public void foo() {\n" + 
		   		"	}\n" + 
		   		"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 7)\n" + 
				"	* @see #X(String)\n" + 
				"	        ^^^^^^^^^\n" + 
				"Javadoc: The constructor X(String) is undefined\n" + 
				"----------\n"
		);
	}
	public void testBug45958b() {
		runNegativeTest(
			new String[] {
			   "X.java",
		   		"public class X {\n" + 
		   		"	int x;\n" + 
		   		"	public X(int i) {\n" + 
		   		"		x = i;\n" + 
		   		"	}\n" + 
		   		"	/**\n" + 
		   		"	 * @see #X(int)\n" + 
		   		"	 */\n" + 
		   		"	public void foo() {\n" + 
		   		"	}\n" + 
		   		"}\n",
		   		"XX.java",
		   		"public class XX extends X {\n" + 
		   		"	/**\n" + 
		   		"	 * @param i\n" + 
		   		"	 * @see #X(int)\n" + 
		   		"	 */\n" + 
		   		"	public XX(int i) {\n" + 
		   		"		super(i);\n" + 
		   		"		x++;\n" + 
		   		"	}\n" + 
		   		"}\n"
			},
			"----------\n" + 
				"1. ERROR in XX.java (at line 4)\n" + 
				"	* @see #X(int)\n" + 
				"	        ^\n" + 
				"Javadoc: The method X(int) is undefined for the type XX\n" + 
				"----------\n"
			);
	}
	public void testBug45958c() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	int x;\n" + 
				"	public X(int i) {\n" + 
				"		x = i;\n" + 
				"	}\n" + 
				"	/**\n" + 
				"	 * @see #X(String)\n" + 
				"	 */\n" + 
				"	void foo() {\n" + 
				"	}\n" + 
				"	void X(String str) {}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 46901.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=46901">46901</a>
	 */
	public void testBug46901() {
		runConformTest(
			new String[] {
				"A.java",
				"public abstract class A {\n" + 
				"	public A() { super(); }\n" + 
				"}\n",
				"X.java",
				"/**\n" + 
				" * @see A#A()\n" + 
				" */\n" + 
				"public class X extends A {\n" + 
				"	public X() { super(); }\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 47215.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47215">47215</a>
	 */
	public void testBug47215() {
		runNegativeTest(
			new String[] {
				"X.java",
				"	/**\n" + 
				"	 * @see X\n" + 
				"	 * @see X#X(int)\n" + 
				"	 * @see X(double)\n" + 
				"	 * @see X   (double)\n" + 
				"	 * @see X[double]\n" + 
				"	 * @see X!=}}\n" + 
				"	 * @see foo()\n" + 
				"	 * @see foo  ()\n" + 
				"	 */\n" + 
				"	public class X {\n" + 
				"		public X(int i){}\n" + 
				"		public void foo() {}\n" + 
				"	}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	* @see X(double)\n" + 
				"	       ^^^^^^^^^\n" + 
				"Javadoc: Missing #: \"X(double)\"\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	* @see X[double]\n" + 
				"	       ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	* @see X!=}}\n" + 
				"	       ^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	* @see foo()\n" + 
				"	       ^^^^^\n" + 
				"Javadoc: Missing #: \"foo()\"\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 9)\n" + 
				"	* @see foo  ()\n" + 
				"	       ^^^\n" + 
				"Javadoc: foo cannot be resolved to a type\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 47341.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47341">47341</a>
	 */
	public void testBug47341() {
		runConformTest(
			new String[] {
				"p1/X.java",
				"package p1;\n" + 
				"public class X {\n" + 
				"	void foo_package() {}\n" + 
				"	protected void foo_protected() {}\n" + 
				"}\n",
				"p1/Y.java",
				"package p1;\n" + 
				"public class Y extends X {\n" + 
				"	/**\n" + 
				"	 * @see #foo_package()\n" + 
				"	 */\n" + 
				"	protected void bar() {\n" + 
				"		foo_package();\n" + 
				"	}\n" + 
				"}\n",
				"p2/Y.java",
				"package p2;\n" + 
				"import p1.X;\n" + 
				"\n" + 
				"public class Y extends X {\n" + 
				"	/**\n" + 
				"	 * @see X#foo_protected()\n" + 
				"	 */\n" + 
				"	protected void bar() {\n" + 
				"		foo_protected();\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 47132.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47132">47132</a>
	 */
	public void testBug47132() {
		reportMissingJavadocComments = CompilerOptions.ERROR;
		runConformTest(
			new String[] {
				"X.java",
				"/** */\n" + 
				"public class X {\n" + 
				"  /** */\n" + 
				"  public void foo(){\n" + 
				"    new Object(){\n" + 
				"		public int x;\n" + 
				"       public void bar(){}\n" + 
				"    };\n" + 
				"  }\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 47339.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=47339">47339</a>
	 */
	public void testBug47339() {
		runConformTest(
			new String[] {
				"X.java",
				"/** */\n" + 
				"public class X implements Comparable {\n" + 
				"	/**\n" + 
				"	 * @see java.lang.Comparable#compareTo(java.lang.Object)\n" + 
				"	 */\n" + 
				"	public int compareTo(Object o) {\n" + 
				"		return 0;\n" + 
				"	}\n" + 
				"	/** @see Object#toString() */\n" + 
				"	public String toString(){\n" + 
				"		return \"\";\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}
	public void testBug47339a() {
		runConformTest(
			new String[] {
				"X.java",
				"/** */\n" + 
				"public class X extends RuntimeException {\n" + 
				"	\n" + 
				"	/**\n" + 
				"	 * @see RuntimeException#RuntimeException(java.lang.String)\n" + 
				"	 */\n" + 
				"	public X(String message) {\n" + 
				"		super(message);\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}
	public void testBug47339b() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"/** */\n" + 
				"public class X implements Comparable {\n" + 
				"	/** */\n" + 
				"	public int compareTo(Object o) {\n" + 
				"		return 0;\n" + 
				"	}\n" + 
				"	/** */\n" + 
				"	public String toString(){\n" + 
				"		return \"\";\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	public int compareTo(Object o) {\n" + 
				"	       ^^^\n" + 
				"Javadoc: Missing tag for return type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	public int compareTo(Object o) {\n" + 
				"	                            ^\n" + 
				"Javadoc: Missing tag for parameter o\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 8)\n" + 
				"	public String toString(){\n" + 
				"	       ^^^^^^\n" + 
				"Javadoc: Missing tag for return type\n" + 
				"----------\n"
		);
	}
	public void testBug47339c() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"/** */\n" + 
				"public class X extends RuntimeException {\n" + 
				"	\n" + 
				"	/** */\n" + 
				"	public X(String message) {\n" + 
				"		super(message);\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 5)\n" + 
			"	public X(String message) {\n" + 
			"	                ^^^^^^^\n" + 
			"Javadoc: Missing tag for parameter message\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 48064.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48064">48064</a>
	 */
	public void testBug48064() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	public X(String str) {}\n" + 
				"}\n",
				"Y.java",
				"public class Y extends X {\n" + 
				"	/**\n" + 
				"	 * @see X#X(STRING)\n" + 
				"	 */\n" + 
				"	public Y(String str) {super(str);}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Y.java (at line 3)\n" + 
			"	* @see X#X(STRING)\n" + 
			"	           ^^^^^^\n" + 
			"Javadoc: STRING cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in Y.java (at line 5)\n" + 
			"	public Y(String str) {super(str);}\n" + 
			"	                ^^^\n" + 
			"Javadoc: Missing tag for parameter str\n" + 
			"----------\n"
		);
	}
	public void testBug48064a() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	public void foo(String str) {}\n" + 
				"}\n",
				"Y.java",
				"public class Y extends X {\n" + 
				"	/**\n" + 
				"	 * @see X#foo(STRING)\n" + 
				"	 */\n" + 
				"	public void foo(String str) {super.foo(str);}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Y.java (at line 3)\n" + 
			"	* @see X#foo(STRING)\n" + 
			"	             ^^^^^^\n" + 
			"Javadoc: STRING cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in Y.java (at line 5)\n" + 
			"	public void foo(String str) {super.foo(str);}\n" + 
			"	                       ^^^\n" + 
			"Javadoc: Missing tag for parameter str\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 48523.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48523">48523</a>
	 */
	public void testBug48523() {
		runConformTest(
			new String[] {
				"X.java",
				"import java.io.IOException;\n" + 
					"public class X {\n" + 
					"	public void foo() throws IOException {}\n" + 
					"}\n",
				"Y.java",
				"import java.io.IOException;\n" + 
					"public class Y extends X {\n" + 
					"	/**\n" + 
					"	 * @throws IOException\n" + 
					"	 * @see X#foo()\n" + 
					"	 */\n" + 
					"	public void foo() throws IOException {}\n" + 
					"}\n"
			}
		);
	}

	/**
	 * Bug 48711.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48711">48711</a>
	 */
	public void testBug48711() {
		runConformTest(
			new String[] {
				"X.java",
				"import java.io.*;\n" + 
				"\n" + 
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @throws IOException\n" + 
				"	 * @throws EOFException\n" + 
				"	 * @throws FileNotFoundException\n" + 
				"	 */\n" + 
				"	public void foo() throws IOException {}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 45782.
	 * When this bug happened, compiler wrongly complained on missing parameters declaration
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=45782">45782</a>
	 */
	public void testBug45782() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X implements Comparable {\n" + 
					"\n" + 
					"	/**\n" + 
					"	 * Overridden method with return value and parameters.\n" + 
					"	 * {@inheritDoc}\n" + 
					"	 */\n" + 
					"	public boolean equals(Object obj) {\n" + 
					"		return super.equals(obj);\n" + 
					"	}\n" + 
					"\n" + 
					"	/**\n" + 
					"	 * Overridden method with return value and thrown exception.\n" + 
					"	 * {@inheritDoc}\n" + 
					"	 */\n" + 
					"	public Object clone() throws CloneNotSupportedException {\n" + 
					"		return super.clone();\n" + 
					"	}\n" + 
					"\n" + 
					"	/**\n" + 
					"	 * Implemented method (Comparable)  with return value and parameters.\n" + 
					"	 * {@inheritDoc}\n" + 
					"	 */\n" + 
					"	public int compareTo(Object o) { return 0; }\n" + 
					"}\n"
			});
	}
	public void testBug45782a() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Unefficient inheritDoc tag on a method which is neither overridden nor implemented...\n" + 
					"	 * {@inheritDoc}\n" + 
					"	 */\n" + 
					"	public int foo(String str) throws IllegalArgumentException { return 0; }\n" + 
					"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	* {@inheritDoc}\n" + 
			"	    ^^^^^^^^^^\n" + 
			"Javadoc: Unexpected tag\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	public int foo(String str) throws IllegalArgumentException { return 0; }\n" + 
			"	       ^^^\n" + 
			"Javadoc: Missing tag for return type\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	public int foo(String str) throws IllegalArgumentException { return 0; }\n" + 
			"	                      ^^^\n" + 
			"Javadoc: Missing tag for parameter str\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 6)\n" + 
			"	public int foo(String str) throws IllegalArgumentException { return 0; }\n" + 
			"	                                  ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Missing tag for declared exception IllegalArgumentException\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 49260.
	 * When this bug happened, compiler wrongly complained on Invalid parameters declaration
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49260">49260</a>
	 */
	public void testBug49260() {
		runConformTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" + 
					"public final class X {\n" + 
					"	int bar(String str, int var, Vector list, char[] array) throws IllegalAccessException { return 0; }\n" + 
					"	/**\n" + 
					"	 * Valid method reference on several lines\n" + 
					"	 * @see #bar(String str,\n" + 
					"	 * 		int var,\n" + 
					"	 * 		Vector list,\n" + 
					"	 * 		char[] array)\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n" });
	}

	/**
	 * Bug 48385.
	 * When this bug happened, compiler does not complain on CharOperation references in @link tags
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48385">48385</a>
	 */
	public void testBug48385() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" + 
					"public class X {\n" + 
					"	/**\n" + 
					"	 * Method outside javaDoc Comment\n" + 
					"	 *  1) {@link String} tag description not empty\n" + 
					"	 *  2) {@link CharOperation Label not empty} tag description not empty\n" + 
					"	 * @param str\n" + 
					"	 * @param var tag description not empty\n" + 
					"	 * @param list third param with embedded tag: {@link Vector}\n" + 
					"	 * @param array fourth param with several embedded tags on several lines:\n" + 
					"	 *  1) {@link String} tag description not empty\n" + 
					"	 *  2) {@linkplain CharOperation Label not empty} tag description not empty\n" + 
					"	 * @throws IllegalAccessException\n" + 
					"	 * @throws NullPointerException tag description not empty\n" + 
					"	 * @return an integer\n" + 
					"	 * @see String\n" + 
					"	 * @see Vector tag description not empty\n" + 
					"	 * @see Object tag description includes embedded tags and several lines:\n" + 
					"	 *  1) {@link String} tag description not empty\n" + 
					"	 *  2) {@link CharOperation Label not empty} tag description not empty\n" + 
					"	 */\n" + 
					"	int foo(String str, int var, Vector list, char[] array) throws IllegalAccessException { return 0; }\n" + 
					"}\n"},
			"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	*  2) {@link CharOperation Label not empty} tag description not empty\n" + 
				"	             ^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 12)\n" + 
				"	*  2) {@linkplain CharOperation Label not empty} tag description not empty\n" + 
				"	                  ^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 20)\n" + 
				"	*  2) {@link CharOperation Label not empty} tag description not empty\n" + 
				"	             ^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n"
		);
	}

	public void testBug48385And49620() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" + 
					"public class X {\n" + 
					"	/**\n" + 
					"	 * Method outside javaDoc Comment\n" + 
					"	 *  1) {@link\n" + 
					"	 * 				String} tag description not empty\n" + 
					"	 *  2) {@link\n" + 
					"	 * 				CharOperation Label not empty} tag description not empty\n" + 
					"	 * @param\n" + 
					"	 * 				str\n" + 
					"	 * @param\n" + 
					"	 * 				var tag description not empty\n" + 
					"	 * @param list third param with embedded tag: {@link\n" + 
					"	 * 				Vector} but also on several lines: {@link\n" + 
					"	 * 				CharOperation}\n" + 
					"	 * @param array fourth param with several embedded tags on several lines:\n" + 
					"	 *  1) {@link String} tag description not empty\n" + 
					"	 *  2) {@link CharOperation Label not empty} tag description not empty\n" + 
					"	 * @throws\n" + 
					"	 * 					IllegalAccessException\n" + 
					"	 * @throws\n" + 
					"	 * 					NullPointerException tag description not empty\n" + 
					"	 * @return\n" + 
					"	 * 					an integer\n" + 
					"	 * @see\n" + 
					"	 * 			String\n" + 
					"	 * @see\n" + 
					"	 * 		Vector\n" + 
					"	 * 		tag description not empty\n" + 
					"	 * @see Object tag description includes embedded tags and several lines:\n" + 
					"	 *  1) {@link String} tag description not empty\n" + 
					"	 *  2) {@link CharOperation Label not empty} tag description not empty\n" + 
					"	 */\n" + 
					"	int foo(String str, int var, Vector list, char[] array) throws IllegalAccessException { return 0; }\n" + 
					"}\n"},
			"----------\n" + 
				"1. ERROR in X.java (at line 8)\n" + 
				"	* 				CharOperation Label not empty} tag description not empty\n" + 
				"	  				^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 15)\n" + 
				"	* 				CharOperation}\n" + 
				"	  				^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 18)\n" + 
				"	*  2) {@link CharOperation Label not empty} tag description not empty\n" + 
				"	             ^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 32)\n" + 
				"	*  2) {@link CharOperation Label not empty} tag description not empty\n" + 
				"	             ^^^^^^^^^^^^^\n" + 
				"Javadoc: CharOperation cannot be resolved to a type\n" + 
				"----------\n"
		);
	}
	public void testBug48385a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Method outside javaDoc Comment\n" + 
					"	 *  1) {@link } Missing reference\n" + 
					"	 *  2) {@link Unknown} Cannot be resolved\n" + 
					"	 *  3) {@link *} Missing reference\n" + 
					"	 *  4) {@link #} Invalid reference\n" + 
					"	 *  5) {@link String } } Valid reference\n" + 
					"	 *  6) {@link String {} Invalid tag\n" + 
					"	 * @return int\n" + 
					"	 */\n" + 
					"	int foo() {return 0;}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	*  1) {@link } Missing reference\n" + 
				"	        ^^^^\n" + 
				"Javadoc: Missing reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	*  2) {@link Unknown} Cannot be resolved\n" + 
				"	             ^^^^^^^\n" + 
				"Javadoc: Unknown cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	*  3) {@link *} Missing reference\n" + 
				"	        ^^^^\n" + 
				"Javadoc: Missing reference\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 7)\n" + 
				"	*  4) {@link #} Invalid reference\n" + 
				"	             ^\n" + 
				"Javadoc: Invalid reference\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 9)\n" + 
				"	*  6) {@link String {} Invalid tag\n" + 
				"	      ^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Missing closing brace for inline tag\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 49491.
	 * When this bug happened, compiler complained on duplicated throws tag
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49491">49491</a>
	 */
	public void testBug49491() {
		runConformTest(
			new String[] {
				"X.java",
				"public final class X {\n" + 
					"	/**\n" + 
					"	 * Now valid duplicated throws tag\n" + 
					"	 * @throws IllegalArgumentException First comment\n" + 
					"	 * @throws IllegalArgumentException Second comment\n" + 
					"	 * @throws IllegalArgumentException Last comment\n" + 
					"	 */\n" + 
					"	void foo() throws IllegalArgumentException {}\n" + 
					"}\n" });
	}
	public void testBug49491a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public final class X {\n" + 
					"	/**\n" + 
					"	 * Duplicated param tags should be still flagged\n" + 
					"	 * @param str First comment\n" + 
					"	 * @param str Second comment\n" + 
					"	 * @param str Last comment\n" + 
					"	 */\n" + 
					"	void foo(String str) {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	* @param str Second comment\n" + 
				"	         ^^^\n" + 
				"Javadoc: Duplicate tag for parameter\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	* @param str Last comment\n" + 
				"	         ^^^\n" + 
				"Javadoc: Duplicate tag for parameter\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 48376.
	 * When this bug happened, compiler complained on duplicated throws tag
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=48376">48376</a>
	 */
	public void testBug48376() {
		runConformTest(
			new String[] {
				"X.java",
				"/**\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">IBM Home Page</a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">\n" + 
					"	*          IBM Home Page</a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">\n" + 
					"	*          IBM Home Page\n" + 
					"	* 			</a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">\n" + 
					"	*\n" + 
					"	*          IBM\n" + 
					"	*\n" + 
					"	*          Home Page\n" + 
					"	*\n" + 
					"	*\n" + 
					"	* 			</a>\n" + 
					"	* @see Object\n" + 
					"	*/\n" + 
					"public class X {\n" + 
					"}\n"
		 });
	}
	public void testBug48376a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">IBM Home Page\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">\n" + 
					"	*          IBM Home Page\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">\n" + 
					"	*          IBM Home Page<\n" + 
					"	* 			/a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\">\n" + 
					"	*\n" + 
					"	*          IBM\n" + 
					"	*\n" + 
					"	*          Home Page\n" + 
					"	*\n" + 
					"	*\n" + 
					"	* 			\n" + 
					"	* @see Unknown\n" + 
					"	*/\n" + 
					"public class X {\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	* @see <a href=\"http:/www.ibm.com\">IBM Home Page\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	* @see <a href=\"http:/www.ibm.com\">\n" + 
				"	*          IBM Home Page\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	*          IBM Home Page<\n" + 
				"	                        ^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	* @see <a href=\"http:/www.ibm.com\">\n" + 
				"	*\n" + 
				"	*          IBM\n" + 
				"	*\n" + 
				"	*          Home Page\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 16)\n" + 
				"	* @see Unknown\n" + 
				"	       ^^^^^^^\n" + 
				"Javadoc: Unknown cannot be resolved to a type\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 50644.
	 * When this bug happened, compiler complained on duplicated throws tag
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50644">50644</a>
	 */
	public void testBug50644() {
		reportInvalidJavadoc = CompilerOptions.IGNORE;
		runConformTest(
			new String[] {
				"p1/X.java",
				"package p1;\n" + 
					"public class X {\n" + 
					"	/**\n" + 
					"	 * Should not be @deprecated\n" + 
					"	 */\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"p2/Y.java",
				"package p2;\n" + 
					"import p1.X;\n" + 
					"public class Y {\n" + 
					"	public void foo() {\n" + 
					"		X x = new X();\n" + 
					"		x.foo();\n" + 
					"	}\n" + 
					"}\n"
		 });
	}

	/**
	 * Bug 50695.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50695">50695</a>
	 */
	public void testBug50695() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * @see java\n" + 
					"	 * @see java.util\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
		 });
	}
	public void testBug50695b() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * @see java.unknown\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			 },
			"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	* @see java.unknown\n" + 
				"	       ^^^^^^^^^^^^\n" + 
				"Javadoc: java.unknown cannot be resolved to a type\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 51626.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51626">51626</a>
	 */
	public void testBug51626() {
		runConformTest(
			new String[] {
				"p1/X.java",
				"package p1;\n" + 
					"public class X {\n" + 
					"	/**\n" + 
					"	 * @see String\n" + 
					"	 * toto @deprecated\n" + 
					"	 */\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"p2/Y.java",
				"package p2;\n" + 
					"import p1.*;\n" + 
					"public class Y {\n" + 
					"	void foo() {\n" + 
					"		X x = new X(); \n" + 
					"		x.foo();\n" + 
					"	}\n" + 
					"}\n"
		 });
	}

	/**
	 * Bug 52216.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52216">52216</a>
	 */
	public void testBug52216() {
		runConformTest(
			new String[] {
				"X.java",
				"/**\n" + 
					" * Valid ref with white spaces at the end\n" + 
					"* @see <a href=\"http://www.ietf.org/rfc/rfc2045.txt\">RFC 2045 - Section 6.8</a>		   \n" + 
					"*/\n" + 
					"public class X {\n" + 
					"}\n"
		 });
	}
	public void testBug52216a() {
		runConformTest(
			new String[] {
				"X.java",
				"/**\n" + 
					"* @see \"Valid ref with white spaces at the end\"	   \n" + 
					"*/\n" + 
					"public class X {\n" + 
					"}\n"
		 });
	}
	public void testBug52216b() {
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" + 
					"* @see <a href=\"http://www.ietf.org/rfc/rfc2045.txt\">RFC 2045 - Section 6.8</a>		   \n" + 
					"* @see <a href=\"http://www.ietf.org/rfc/rfc2045.txt\">RFC 2045 - Section 6.8</a>\n" + 
					"* @see <a href=\"http://www.ietf.org/rfc/rfc2045.txt\">RFC 2045 - Section 6.8</a>			,\n" + 
					"* @see \"Valid ref with white spaces at the end\"\n" + 
					"* @see \"Valid ref with white spaces at the end\"	   \n" + 
					"* @see \"Invalid ref\"	   .\n" + 
					"*/\n" + 
					"public class X {\n" + 
					"}\n"
			 },
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	* @see <a href=\"http://www.ietf.org/rfc/rfc2045.txt\">RFC 2045 - Section 6.8</a>			,\n" + 
				"	                                                                            ^^^^^^^\n" + 
				"Javadoc: Unexpected text\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\n" + 
				"	* @see \"Invalid ref\"	   .\n" + 
				"	                    ^^^^^\n" + 
				"Javadoc: Unexpected text\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 51529.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51529">51529</a>
	 */
	public void testBug51529() {
		runConformTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" + 
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see Vector\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n"
		 });
	}
	public void testBug51529a() {
		reportInvalidJavadoc = CompilerOptions.IGNORE;
		reportMissingJavadocComments = CompilerOptions.IGNORE;
		runConformTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" + 
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see Vector\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n"
			}
		);
	}
	public void testBug51529b() {
		docCommentSupport = CompilerOptions.DISABLED;
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" + 
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see Vector\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	import java.util.Vector;\n" + 
				"	       ^^^^^^^^^^^^^^^^\n" + 
				"The import java.util.Vector is never used\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 51911.
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51911">51911</a>
	 */
	public void testBug51911() {
		// Warn an ambiguous method reference
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" +
					" * @see #foo\n" +
					" */\n" +
					"public class X {\n" +
					"	public void foo(int i, float f) {}\n" +
					"	public void foo(String str) {}\n" +
					"}\n"
		 	},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	* @see #foo\n" + 
				"	        ^^^\n" + 
				"Javadoc: foo is an ambiguous method reference or is not a field\n" + 
				"----------\n"
		);
	}
	public void testBug51911a() {
		// Accept unambiguous method reference
		runConformTest(
			new String[] {
				"X.java",
				"/**\n" +
					" * @see #foo\n" +
					" */\n" +
					"public class X {\n" +
					"	public void foo(String str) {}\n" +
					"}\n"
		 	}
		);
	}
	public void testBug51911b() {
		// Accept field reference with method name
		runConformTest(
			new String[] {
				"X.java",
				"/**\n" +
					" * @see #foo\n" +
					" */\n" +
					"public class X {\n" +
					"	public int foo;\n" +
					"	public void foo(String str) {}\n" +
					"}\n"
		 	}
		);
	}
	public void testBug51911c() {
		// Accept field reference with ambiguous method name
		runConformTest(
			new String[] {
				"X.java",
					"/**\n" +
					" * @see #foo\n" +
					" */\n" +
					"public class X {\n" +
					"	public int foo;\n" +
					"	public void foo() {}\n" +
					"	public void foo(String str) {}\n" +
					"}\n"
		 	}
		);
	}

	/**
	 * Bug 53279: [Javadoc] Compiler should complain when inline tag is not terminated
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53279">53279</a>
	 */
	public void testBug53279() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Unterminated inline tags\n" + 
					"	 *  {@link Object\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	*  {@link Object\n" + 
				"	   ^^^^^^^^^^^^^\n" + 
				"Javadoc: Missing closing brace for inline tag\n" + 
				"----------\n"
		);
	}
	public void testBug53279a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Unterminated inline tags\n" + 
					"	 *  {@link Object\n" + 
					"	 * @return int\n" + 
					"	 */\n" + 
					"	int foo() {return 0;}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	*  {@link Object\n" + 
				"	   ^^^^^^^^^^^^^\n" + 
				"Javadoc: Missing closing brace for inline tag\n" + 
				"----------\n"
		);
	}
	public void testBug53279b() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Unterminated inline tags\n" + 
					"	 *  {@link        \n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	*  {@link        \n" + 
				"	   ^^^^^^^^^^^^^^\n" + 
				"Javadoc: Missing closing brace for inline tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	*  {@link        \n" + 
				"	     ^^^^\n" + 
				"Javadoc: Missing reference\n" + 
				"----------\n"
		);
	}
	public void testBug53279c() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Unterminated inline tags\n" + 
					"	 *  {@link\n" + 
					"	 * @return int\n" + 
					"	 */\n" + 
					"	int foo() {return 0;}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	*  {@link\n" + 
				"	   ^^^^^^\n" + 
				"Javadoc: Missing closing brace for inline tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	*  {@link\n" + 
				"	     ^^^^\n" + 
				"Javadoc: Missing reference\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 53290: [Javadoc] Compiler should complain when tag name is not correct
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53290">53290</a>
	 */
	public void testBug53290() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * See as inline tag\n" + 
					"	 *  {@see Object}\n" + 
					"	 *  @see Object\n" + 
					"	 *  @link Object\n" + 
					"	 *  {@link Object}\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	*  {@see Object}\n" + 
				"	     ^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	*  @link Object\n" + 
				"	    ^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 62812: Some malformed javadoc tags are not reported as malformed
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=62812">62812</a>
	 */
	public void testBug62812() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * @see Object#clone())\n" + 
					" * @see Object#equals(Object)}\n" + 
					" * @see Object#equals(Object))\n" + 
					" * @see Object#equals(Object)xx\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in Test.java (at line 2)\n" + 
				"	* @see Object#clone())\n" + 
				"	                   ^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"2. ERROR in Test.java (at line 3)\n" + 
				"	* @see Object#equals(Object)}\n" + 
				"	                    ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in Test.java (at line 4)\n" + 
				"	* @see Object#equals(Object))\n" + 
				"	                    ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"4. ERROR in Test.java (at line 5)\n" + 
				"	* @see Object#equals(Object)xx\n" + 
				"	                    ^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n"
		);
	}
	public void testBug62812a() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * {@link Object#clone())}\n" + 
					" * {@link Object#equals(Object)}\n" + 
					" * {@link Object#equals(Object))}\n" + 
					" * {@link Object#equals(Object)xx}\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in Test.java (at line 2)\n" + 
				"	* {@link Object#clone())}\n" + 
				"	                     ^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"2. ERROR in Test.java (at line 4)\n" + 
				"	* {@link Object#equals(Object))}\n" + 
				"	                      ^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in Test.java (at line 5)\n" + 
				"	* {@link Object#equals(Object)xx}\n" + 
				"	                      ^^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 51606: [Javadoc] Compiler should complain when tag name is not correct
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51606">51606</a>
	 */
	public void testBug51606() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"  /**\n" + 
					"   * @param a aaa\n" + 
					"   * @param b bbb\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n",
				"Y.java",
				"public class Y extends X {\n" + 
					"  /**\n" + 
					"  *  @param a {@inheritDoc}\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in Y.java (at line 5)\n" + 
				"	public void foo(int a, int b) {\n" + 
				"	                           ^\n" + 
				"Javadoc: Missing tag for parameter b\n" + 
				"----------\n"
		);
	}
	public void testBug51606a() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"  /**\n" + 
					"   * @param a aaa\n" + 
					"   * @param b bbb\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n",
				"Y.java",
				"public class Y extends X {\n" + 
					"  /**\n" + 
					"   * {@inheritDoc}\n" + 
					"  *  @param a aaaaa\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n"
			},
			""
		);
	}
	public void testBug51606b() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"  /**\n" + 
					"   * @param a aaa\n" + 
					"   * @param b bbb\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n",
				"Y.java",
				"public class Y extends X {\n" + 
					"  /**\n" + 
					"   * Text before inherit tag\n" + 
					"   * {@inheritDoc}\n" + 
					"  *  @param a aaaaa\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n"
			}
		);
	}
	public void testBug51606c() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"  /**\n" + 
					"   * @param a aaa\n" + 
					"   * @param b bbb\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n",
				"Y.java",
				"public class Y extends X {\n" + 
					"  /**\n" + 
					"   * Text before inherit tag {@inheritDoc}\n" + 
					"  *  @param a aaaaa\n" + 
					"   */\n" + 
					"  public void foo(int a, int b) {\n" + 
					"  }\n" + 
					"}\n"
			}
		);
	}

	/**
	 * Bug 65174: Spurious "Javadoc: Missing reference" error
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=65174">65174</a>
	 */
	public void testBug65174() {
		runConformTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * Comment with no error: {@link\n" + 
					" * Object valid} because it\'s not on first line\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"	/** Comment previously with error: {@link\n" + 
					"	 * Object valid} because tag is on comment very first line\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug65174a() {
		runConformTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * Comment with no error: {@link    		\n" + 
					" * Object valid} because it\'s not on first line\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"	/** Comment previously with error: {@link   		\n" + 
					"	 * Object valid} because tag is on comment very first line\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug65174b() {
		runConformTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * Comment with no error: {@link java.lang.\n" + 
					" * Object valid} because it\'s not on first line\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"	/** Comment previously with error: {@link java.lang.\n" + 
					"	 * Object valid} because tag is on comment very first line\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug65174c() {
		runConformTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * Comment with no error: {@link Object\n" + 
					" * valid} because it\'s not on first line\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"	/** Comment previously with no error: {@link Object\n" + 
					"	 * valid} because tag is on comment very first line\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug65174d() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	/** Comment previously with no error: {@link Object valid} comment on one line */\n" + 
					"	void foo1() {}\n" + 
					"	/** Comment previously with no error: {@link Object valid}       */\n" + 
					"	void foo2() {}\n" + 
					"	/** Comment previously with no error: {@link Object valid}*/\n" + 
					"	void foo3() {}\n" + 
					"	/**                    {@link Object valid} comment on one line */\n" + 
					"	void foo4() {}\n" + 
					"	/**{@link Object valid} comment on one line */\n" + 
					"	void foo5() {}\n" + 
					"	/**       {@link Object valid} 				*/\n" + 
					"	void foo6() {}\n" + 
					"	/**{@link Object valid} 				*/\n" + 
					"	void foo7() {}\n" + 
					"	/**				{@link Object valid}*/\n" + 
					"	void foo8() {}\n" + 
					"	/**{@link Object valid}*/\n" + 
					"	void foo9() {}\n" + 
					"}\n"
			}
		);
	}

	/**
	 * Bug 65180: Spurious "Javadoc: xxx cannot be resolved or is not a field" error with inner classes
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=65180">65180</a>
	 */
	public void testBug65180() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	public class Inner {\n" + 
					"		/**\n" + 
					"		 * Does something.\n" + 
					"		 * \n" + 
					"		 * @see #testFunc\n" + 
					"		 */\n" + 
					"		public void innerFunc() {\n" + 
					"			testFunc();\n" + 
					"		}\n" + 
					"	}\n" + 
					"	\n" + 
					"	public void testFunc() {}\n" + 
					"}\n" + 
					"\n"
			},
			"----------\n" + 
				"1. ERROR in Test.java (at line 6)\r\n" + 
				"	* @see #testFunc\r\n" + 
				"	        ^^^^^^^^\n" + 
				"Javadoc: testFunc cannot be resolved or is not a field\n" + 
				"----------\n"
		);
	}
	public void testBug65180a() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	public class Inner {\n" + 
					"		/**\n" + 
					"		 * Does something.\n" + 
					"		 * \n" + 
					"		 * @see #testFunc()\n" + 
					"		 */\n" + 
					"		public void innerFunc() {\n" + 
					"			testFunc();\n" + 
					"		}\n" + 
					"	}\n" + 
					"	\n" + 
					"	public void testFunc() {}\n" + 
					"}\n" + 
					"\n"
			}
		);
	}
	public void testBug65180b() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	public class Inner {\n" + 
					"		/**\n" + 
					"		 * Does something.\n" + 
					"		 * \n" + 
					"		 * @see Test#testFunc\n" + 
					"		 * @see Test#testFunc()\n" + 
					"		 */\n" + 
					"		public void innerFunc() {\n" + 
					"			testFunc();\n" + 
					"		}\n" + 
					"	}\n" + 
					"	\n" + 
					"	public void testFunc() {}\n" + 
					"}\n" + 
					"\n"
			}
		);
	}
	public void testBug65180c() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	public class Inner {\n" + 
					"		/**\n" + 
					"		 * Does something.\n" + 
					"		 * \n" + 
					"		 * @see #testFunc\n" + 
					"		 */\n" + 
					"		public void innerFunc() {\n" + 
					"			testFunc();\n" + 
					"		}\n" + 
					"	}\n" + 
					"	\n" + 
					"	public void testFunc() {}\n" + 
					"	public void testFunc(String str) {}\n" + 
					"}\n" + 
					"\n"
			},
			"----------\n" + 
				"1. ERROR in Test.java (at line 6)\n" + 
				"	* @see #testFunc\n" + 
				"	        ^^^^^^^^\n" + 
				"Javadoc: testFunc cannot be resolved or is not a field\n" + 
				"----------\n"
		);
	}
	public void testBug65180d() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	int testField;\n" + 
					"	public class Inner {\n" + 
					"		/**\n" + 
					"		 * Does something.\n" + 
					"		 * \n" + 
					"		 * @see #testField\n" + 
					"		 * @see #testFunc(int)\n" + 
					"		 */\n" + 
					"		public void innerFunc() {\n" + 
					"			testFunc(testField);\n" + 
					"		}\n" + 
					"	}\n" + 
					"	\n" + 
					"	public void testFunc(int test) {\n" + 
					"		testField = test; \n" + 
					"	}\n" + 
					"}\n" + 
					"\n"
			}
		);
	}
	public void testBug65180e() {
		runConformTest(
			new String[] {
				"ITest.java",
				"public interface ITest {\n" + 
					"	/**\n" + 
					"	 * @see #foo() \n" + 
					"	 */\n" + 
					"	public static int field = 0;\n" + 
					"	/**\n" + 
					"	 * @see #field\n" + 
					"	 */\n" + 
					"	public void foo();\n" + 
					"}\n"
			}
		);
	}
	public void testBug65180f() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"    static class SuperInner {\n" + 
					"    	public int field;\n" + 
					"        public void foo() {}\n" + 
					"     }\n" + 
					"    \n" + 
					"	public static class Inner extends SuperInner {\n" + 
					"		/**\n" + 
					"		 * @see #field\n" + 
					"		 */\n" + 
					"		public static int f;\n" + 
					"		/**\n" + 
					"		 * @see #foo()\n" + 
					"		 */\n" + 
					"		public static void bar() {}\n" + 
					"	}\n" + 
					"	\n" + 
					"	public void foo() {}\n" + 
					"}"
			}
		);
	}

	/**
	 * Bug 65253: [Javadoc] @@tag is wrongly parsed as @tag
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=65253">65253</a>
	 */
	public void testBug65253() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"Test.java",
				"/**\n" + 
					" * Comment \n" + 
					" * @@@@see Unknown Should not complain on ref\n" + 
					" */\n" + 
					"public class Test {\n" + 
					"	/**\n" + 
					"	 * Comment\n" + 
					"	 * @@@param xxx Should not complain on param\n" + 
					"	 * @@return int\n" + 
					"	 */\n" + 
					"	int foo() { // should warn on missing tag for return type\n" + 
					"		return 0;\n" + 
					"	}\n" + 
					"}\n"
			},
			"----------\n" + 
			"1. ERROR in Test.java (at line 3)\n" + 
			"	* @@@@see Unknown Should not complain on ref\n" + 
			"	   ^^^^^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n" + 
			"2. ERROR in Test.java (at line 8)\n" + 
			"	* @@@param xxx Should not complain on param\n" + 
			"	   ^^^^^^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n" + 
			"3. ERROR in Test.java (at line 9)\n" + 
			"	* @@return int\n" + 
			"	   ^^^^^^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n" + 
			"4. ERROR in Test.java (at line 11)\n" + 
			"	int foo() { // should warn on missing tag for return type\n" + 
			"	^^^\n" + 
			"Javadoc: Missing tag for return type\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 66551: Error in org.eclipse.swt project on class PrinterData
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=66551">66551</a>
	 */
	public void testBug66551() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"    int field;\n" + 
					"    /**\n" + 
					"     *  @see #field\n" + 
					"     */\n" + 
					"    void foo(int field) {\n" + 
					"    }\n" + 
					"\n" + 
					"}\n"
			}
		);
	}
	public void testBug66551a() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"    static int field;\n" + 
					"    /**\n" + 
					"     *  @see #field\n" + 
					"     */\n" + 
					"    static void foo(int field) {\n" + 
					"    }\n" + 
					"\n" + 
					"}\n"
			}
		);
	}
	public void testBug66551b() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	int field;\n" + 
					"	/**\n" + 
					"	 * {@link #field}\n" + 
					"	 */\n" + 
					"	void foo(int field) {\n" + 
					"	}\n" + 
					"\n" + 
					"}\n"
			}
		);
	}
	public void testBug66551c() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"	static int field;\n" + 
					"	/**\n" + 
					"	 * {@link #field}\n" + 
					"	 */\n" + 
					"	static void foo(int field) {\n" + 
					"	}\n" + 
					"\n" + 
					"}\n"
			}
		);
	}	

	/**
	 * Bug 66573: Shouldn't bind to local constructs
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=66573">66573</a>
	 */
	public void testBug66573() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"    /**\n" + 
					"     * @see Local\n" + 
					"     */\n" + 
					"    void foo() {\n" + 
					"        class Local { \n" + 
					"            // shouldn\'t be seen from javadoc\n" + 
					"         }\n" + 
					"    }\n" + 
					"}\n"	
			},
			"----------\n" + 
				"1. ERROR in Test.java (at line 3)\n" + 
				"	* @see Local\n" + 
				"	       ^^^^^\n" + 
				"Javadoc: Local cannot be resolved to a type\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 68017: Javadoc processing does not detect missing argument to @return
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68017">68017</a>
	 */
	public void testBug68017conform() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@return valid integer*/\n" + 
					"	public int foo1() {return 0; }\n" + 
					"	/**\n" + 
					"	 *	@return #\n" + 
					"	 */\n" + 
					"	public int foo2() {return 0; }\n" + 
					"}\n",
			}
		);
	}
	public void testBug68017negative() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@return*/\n" + 
					"	public int foo1() {return 0; }\n" + 
					"	/**@return        */\n" + 
					"	public int foo2() {return 0; }\n" + 
					"	/**@return****/\n" + 
					"	public int foo3() {return 0; }\n" + 
					"	/**\n" + 
					"	 *	@return\n" + 
					"	 */\n" + 
					"	public int foo4() {return 0; }\n" + 
					"}\n",
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	/**@return*/\n" + 
				"	    ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	/**@return        */\n" + 
				"	    ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	/**@return****/\n" + 
				"	    ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 9)\n" + 
				"	*	@return\n" + 
				"	 	 ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n"
		);
	}
	// Javadoc issue a warning on following tests
	public void testBug68017javadocWarning1() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@return* */\n" + 
					"	public int foo1() {return 0; }\n" + 
					"	/**@return** **/\n" + 
					"	public int foo2() {return 0; }\n" + 
					"}\n",
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	*	@return* */\n" + 
				"	 	 ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	/**@return** **/\n" + 
				"	    ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n"
		);
	}
	public void testBug68017javadocWarning2() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 *	@return #\n" + 
				"	 */\n" + 
				"	public int foo1() {return 0; }\n" + 
				"	/**\n" + 
				"	 *	@return @\n" + 
				"	 */\n" + 
				"	public int foo2() {return 0; }\n" + 
				"}\n"
			}
		);
	}
	public void testBug68017javadocWarning3() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@return#\n" + 
					"	 *	@return#text\n" + 
					"	 */\n" + 
					"	public int foo() {return 0; }\n" + 
					"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	*	@return#\n" + 
			"	 	 ^^^^^^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	*	@return#text\n" + 
			"	 	 ^^^^^^^^^^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 68025: Javadoc processing does not detect some wrong links
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68025">68025</a>
	 */
	public void testBug68025conform() {
		runConformTest(
			new String[] {
				"Y.java",
				"public class Y {\n" + 
					"	public int field;\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Z.java",
				"public class Z {\n" + 
					"	/**\n" + 
					"	 *	@see Y#field #valid\n" + 
					"	 *	@see Y#foo #valid\n" + 
					"	 */\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see Y#field     # valid*/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see Y#foo		# valid*/\n" + 
					"	public void foo3() {}\n" + 
					"	/**@see Y#foo()\n" + 
					"	 *# valid*/\n" + 
					"	public void foo4() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug68025negative() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	public int field;\n" + 
					"	public void foo() {}\n" + 
					"	/**\n" + 
					"	 *	@see #field#invalid\n" + 
					"	 *	@see #foo#invalid\n" + 
					"	 */\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see Y#field# invalid*/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see Y#foo#	invalid*/\n" + 
					"	public void foo3() {}\n" + 
					"	/**@see Y#foo()#\n" + 
					"	 *valid*/\n" + 
					"	public void foo4() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	*	@see #field#invalid\n" + 
				"	 	     ^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	*	@see #foo#invalid\n" + 
				"	 	     ^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 9)\n" + 
				"	/**@see Y#field# invalid*/\n" + 
				"	         ^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 11)\n" + 
				"	/**@see Y#foo#	invalid*/\n" + 
				"	         ^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 13)\n" + 
				"	/**@see Y#foo()#\n" + 
				"	             ^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 68726: [Javadoc] Target attribute in @see link triggers warning
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=68726">68726</a>
	 */
	public void testBug68726conform1() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@see Object <a href=\"http://www.eclipse.org\" target=\"_top\">Eclipse</a>\n" + 
					"	 */\n" + 
					"	void foo1() {}\n" + 
					"	/**@see Object <a href=\"http://www.eclipse.org\" target=\"_top\" target1=\"_top1\" target2=\"_top2\">Eclipse</a>*/\n" + 
					"	void foo2() {}\n" + 
					"}\n"	
			}
		);
	}
	public void testBug68726conform2() {
		runConformTest(
			new String[] {
				"X.java",
				"/**\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">IBM Home Page</a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
					"	*          IBM Home Page</a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
					"	*          IBM Home Page\n" + 
					"	* 			</a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
					"	*\n" + 
					"	*          IBM\n" + 
					"	*\n" + 
					"	*          Home Page\n" + 
					"	*\n" + 
					"	*\n" + 
					"	* 			</a>\n" + 
					"	* @see Object\n" + 
					"	*/\n" + 
					"public class X {\n" + 
					"}\n"	
			}
		);
	}
	public void testBug68726negative1() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Invalid URL link references\n" + 
					"	 *\n" + 
					"	 * @see <a href=\"invalid\" target\n" + 
					"	 * @see <a href=\"invalid\" target=\n" + 
					"	 * @see <a href=\"invalid\" target=\"\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\"\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">invalid\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">invalid<\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">invalid</\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">invalid</a\n" + 
					"	 * @see <a href=\"invalid\" target=\"_top\">invalid</a> no text allowed after the href\n" + 
					"	 */\n" + 
					"	void foo() {}\n" + 
					"}\n"	
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	* @see <a href=\"invalid\" target\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	* @see <a href=\"invalid\" target=\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	* @see <a href=\"invalid\" target=\"\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 9)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\"\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 10)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 11)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 12)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">invalid\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 13)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">invalid<\n" + 
				"	                                              ^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 14)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">invalid</\n" + 
				"	                                              ^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"11. ERROR in X.java (at line 15)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">invalid</a\n" + 
				"	                                              ^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"12. ERROR in X.java (at line 16)\n" + 
				"	* @see <a href=\"invalid\" target=\"_top\">invalid</a> no text allowed after the href\n" + 
				"	                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Unexpected text\n" + 
				"----------\n"
		);
	}
	public void testBug68726negative2() {
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">IBM Home Page\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
					"	*          IBM Home Page\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
					"	*          IBM Home Page<\n" + 
					"	* 			/a>\n" + 
					"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
					"	*\n" + 
					"	*          IBM\n" + 
					"	*\n" + 
					"	*          Home Page\n" + 
					"	*\n" + 
					"	*\n" + 
					"	* 			\n" + 
					"	* @see Unknown\n" + 
					"	*/\n" + 
					"public class X {\n" + 
					"}\n"	
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">IBM Home Page\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
				"	*          IBM Home Page\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	*          IBM Home Page<\n" + 
				"	                        ^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	* @see <a href=\"http:/www.ibm.com\" target=\"_top\">\n" + 
				"	*\n" + 
				"	*          IBM\n" + 
				"	*\n" + 
				"	*          Home Page\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 16)\n" + 
				"	* @see Unknown\n" + 
				"	       ^^^^^^^\n" + 
				"Javadoc: Unknown cannot be resolved to a type\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 69272: [Javadoc] Invalid malformed reference (missing separator)
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69272">69272</a>
	 */
	public void testBug69272classValid() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see Object*/\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see Object\n" + 
					"	*/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see Object    */\n" + 
					"	public void foo3() {}\n" + 
					"	/**@see Object****/\n" + 
					"	public void foo4() {}\n" + 
					"	/**@see Object		****/\n" + 
					"	public void foo5() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug69272classInvalid() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see Object* */\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see Object*** ***/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see Object***\n" + 
					"	 */\n" + 
					"	public void foo3() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	/**@see Object* */\n" + 
				"	        ^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	/**@see Object*** ***/\n" + 
				"	        ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	/**@see Object***\n" + 
				"	        ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n"
		);
	}
	public void testBug69272fieldValid() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	int field;\n" + 
					"	/**@see #field*/\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see #field\n" + 
					"	*/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see #field    */\n" + 
					"	public void foo3() {}\n" + 
					"	/**@see #field****/\n" + 
					"	public void foo4() {}\n" + 
					"	/**@see #field		********/\n" + 
					"	public void foo5() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug69272fieldInvalid() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	int field;\n" + 
					"	/**@see #field* */\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see #field*** ***/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see #field***\n" + 
					"	 */\n" + 
					"	public void foo3() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	/**@see #field* */\n" + 
				"	        ^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	/**@see #field*** ***/\n" + 
				"	        ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	/**@see #field***\n" + 
				"	        ^^^^^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n"
		);
	}
	public void testBug69272methodValid() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see Object#wait()*/\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see Object#wait()\n" + 
					"	*/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see Object#wait()    */\n" + 
					"	public void foo3() {}\n" + 
					"	/**@see Object#wait()****/\n" + 
					"	public void foo4() {}\n" + 
					"	/**@see Object#wait()		****/\n" + 
					"	public void foo5() {}\n" + 
					"}\n"
			}
		);
	}
	public void testBug69272methodInvalid() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see Object#wait()* */\n" + 
					"	public void foo1() {}\n" + 
					"	/**@see Object#wait()*** ***/\n" + 
					"	public void foo2() {}\n" + 
					"	/**@see Object#wait()***\n" + 
					"	 */\n" + 
					"	public void foo3() {}\n" + 
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	/**@see Object#wait()* */\n" + 
				"	                   ^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	/**@see Object#wait()*** ***/\n" + 
				"	                   ^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	/**@see Object#wait()***\n" + 
				"	                   ^^^^^\n" + 
				"Javadoc: Malformed reference (missing end space separator)\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 69275: [Javadoc] Invalid warning on @see link
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=69275">69275</a>
	 */
	public void testBug69275conform() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>*/\n" + 
					"	void foo1() {}\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>\n" + 
					"	*/\n" + 
					"	void foo2() {}\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>		*/\n" + 
					"	void foo3() {}\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>**/\n" + 
					"	void foo4() {}\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>     *****/\n" + 
					"	void foo5() {}\n" + 
					"}\n"	
			}
		);
	}
	public void testBug69275negative() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>* */\n" + 
					"	void foo1() {}\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>	** **/\n" + 
					"	void foo2() {}\n" + 
					"	/**@see <a href=\"http://www.eclipse.org\">text</a>**\n" + 
					"	*/\n" + 
					"	void foo3() {}\n" + 
					"}\n"	
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	/**@see <a href=\"http://www.eclipse.org\">text</a>* */\n" + 
				"	                                              ^^^^^^^\n" + 
				"Javadoc: Unexpected text\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	/**@see <a href=\"http://www.eclipse.org\">text</a>	** **/\n" + 
				"	                                              ^^^^^^^^^^\n" + 
				"Javadoc: Unexpected text\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 69302: [Javadoc] Invalid reference warning inconsistent with javadoc tool
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=69302"
	 */
	public void testBug69302conform1() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@see Object <a href=\"http://www.eclipse.org\">Eclipse</a>\n" + 
					"	 */\n" + 
					"	void foo1() {}\n" + 
					"	/**\n" + 
					"	 *	@see Object \"Valid string reference\"\n" + 
					"	 */\n" + 
					"	void foo2() {}\n" + 
					"}\n"	
			}
		);
	}
	public void testBug69302negative1() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@see Unknown <a href=\"http://www.eclipse.org\">Eclipse</a>\n" + 
					"	 */\n" + 
					"	void foo1() {}\n" + 
					"	/**\n" + 
					"	 *	@see Unknown \"Valid string reference\"\n" + 
					"	 */\n" + 
					"	void foo2() {}\n" + 
					"}\n"	
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	*	@see Unknown <a href=\"http://www.eclipse.org\">Eclipse</a>\n" + 
			"	 	     ^^^^^^^\n" + 
			"Javadoc: Unknown cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	*	@see Unknown \"Valid string reference\"\n" + 
			"	 	     ^^^^^^^\n" + 
			"Javadoc: Unknown cannot be resolved to a type\n" + 
			"----------\n"
		);
	}
	public void testBug69302negative2() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**@see Unknown blabla <a href=\"http://www.eclipse.org\">text</a>*/\n" + 
					"	void foo1() {}\n" + 
					"	/**@see Unknown blabla \"Valid string reference\"*/\n" + 
					"	void foo2() {}\n" + 
					"}\n"	
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	/**@see Unknown blabla <a href=\"http://www.eclipse.org\">text</a>*/\n" + 
			"	        ^^^^^^^\n" + 
			"Javadoc: Unknown cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	/**@see Unknown blabla \"Valid string reference\"*/\n" + 
			"	        ^^^^^^^\n" + 
			"Javadoc: Unknown cannot be resolved to a type\n" + 
			"----------\n"
		);
	}

	/**
	 * @bug 70892: [1.5][Javadoc] Compiler should parse reference for inline tag @value
	 * @test Ensure that reference in tag 'value' is only verified when source level >= 1.5
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=70892"
	 */
	public void testBug70892a() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * {@value}\n" + 
				"	 */\n" + 
				"	static int field1;\n" + 
				"	/**\n" + 
				"	 * {@value }\n" + 
				"	 */\n" + 
				"	static int field2;\n" + 
				"	/**\n" + 
				"	 * {@value #field}\n" + 
				"	 */\n" + 
				"	static int field;\n" + 
				"}\n"
			}
		);
	}
	public void testBug70892b() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X {\n" + 
			"	/**\n" + 
			"	 * {@value \"invalid\"}\n" + 
			"	 */\n" + 
			"	final static int field1 = 1;\n" + 
			"	/**\n" + 
			"	 * {@value <a href=\"invalid\">invalid</a>} invalid\n" + 
			"	 */\n" + 
			"	final static int field2 = 2;\n" + 
			"	/**\n" + 
			"	 * {@value #field}\n" + 
			"	 */\n" + 
			"	final static int field3 = 3;\n" + 
			"	/**\n" + 
			"	 * {@value #foo}\n" + 
			"	 */\n" + 
			"	final static int field4 = 4;\n" + 
			"	/**\n" + 
			"	 * {@value #foo()}\n" + 
			"	 */\n" + 
			"	final static int field5 = 5;\n" + 
			"	void foo() {}\n" + 
			"}\n"
		};
		if (this.complianceLevel.equals(COMPLIANCE_1_3) || this.complianceLevel.equals(COMPLIANCE_1_4)) {
			runConformTest(testFiles);
		} else {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\r\n" + 
				"	* {@value \"invalid\"}\r\n" + 
				"	          ^^^^^^^^^\n" + 
				"Javadoc: Only static field reference is allowed for @value tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\r\n" + 
				"	* {@value <a href=\"invalid\">invalid</a>} invalid\r\n" + 
				"	          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Only static field reference is allowed for @value tag\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 11)\r\n" + 
				"	* {@value #field}\r\n" + 
				"	           ^^^^^\n" + 
				"Javadoc: field cannot be resolved or is not a field\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 15)\r\n" + 
				"	* {@value #foo}\r\n" + 
				"	           ^^^\n" + 
				"Javadoc: Only static field reference is allowed for @value tag\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 19)\r\n" + 
				"	* {@value #foo()}\r\n" + 
				"	           ^^^^^\n" + 
				"Javadoc: Only static field reference is allowed for @value tag\n" + 
				"----------\n"
			);
		}
	}

	/**
	 * Bug 73348: [Javadoc] Missing description for return tag is not always warned
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73348">73348</a>
	 */
	public void testBug73348conform() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@return      \n" + 
					"	 *	int\n" + 
					"	 */\n" + 
					"	public int foo1() {return 0; }\n" + 
					"	/**\n" + 
					"	 *	@return      \n" + 
					"	 *	int\n" + 
					"	 *	@see Object\n" + 
					"	 */\n" + 
					"	public int foo2() {return 0; }\n" + 
					"}\n",
			}
		);
	}
	public void testBug73348negative() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@return\n" + 
					"	 *	@see Object\n" + 
					"	 */\n" + 
					"	public int foo1() {return 0; }\n" + 
					"	/**\n" + 
					"	 *	@return      \n" + 
					"	 *	@see Object\n" + 
					"	 */\n" + 
					"	public int foo2() {return 0; }\n" + 
					"}\n",
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	*	@return\n" + 
				"	 	 ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 8)\n" + 
				"	*	@return      \n" + 
				"	 	 ^^^^^^\n" + 
				"Javadoc: Missing return type description\n" + 
 				"----------\n"
 		);
 	}

	/**
	 * Bug 73479: [Javadoc] Improve error message for invalid link in @see tags
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73479">73479</a>
	 */
	public void testBug73479() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@see <a href=\"spec.html#section\">Java Spec<a>\n" + 
					"	 */\n" + 
					"	public void foo() {}\n" + 
					"}\n",
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	*	@see <a href=\"spec.html#section\">Java Spec<a>\n" + 
				"	 	                                          ^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
 				"----------\n"
 		);
 	}

	/**
	 * Bug 73995: [Javadoc] Wrong warning for missing return type description for @return {@inheritdoc}
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=73995">73995</a>
	 */
	public void testBug73995() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 *	@return {@link Object}     \n" + 
					"	 */\n" + 
					"	public int foo1() {return 0; }\n" + 
					"	/** @return {@inheritedDoc} */\n" + 
					"	public int foo2() {return 0; }\n" + 
					"	/**\n" + 
					"	 *	@return\n" + 
					"	 *		{@unknown_tag}\n" + 
					"	 */\n" + 
					"	public int foo3() {return 0; }\n" + 
					"}\n"
			}
 		);
 	}

	/**
	 * Bug 74369: [Javadoc] incorrect javadoc in local class
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=74369">74369</a>
	 */
	public void testBug74369() {
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
					"   public void method() {\n" + 
					"       /**\n" + 
					"        * @see #hsgdfdj\n" + 
					"        */\n" + 
					"        System.out.println(\"println\");\n" + 
					"        class Local {}\n" + 
					"    }\n" + 
					"}"
			}
 		);
 	}
	public void testBug74369deprecated() {
		runNegativeTest(
			new String[] {
				"p/Y.java",
				"package p;\n" + 
					"\n" + 
					"\n" + 
					"public class Y {\n" + 
					"   /**\n" + 
					"    * @deprecated\n" + 
					"    */\n" + 
					"   public void bar() {}\n" + 
					"}\n",
				"X.java",
				"import p.Y;\n" + 
					"\n" + 
					"public class X {\n" + 
					"	Object obj = new Object() {\n" + 
					"		public boolean equals(Object o) {\n" + 
					"			/**\n" + 
					"			 * @deprecated\n" + 
					"			 */\n" + 
					"	        System.out.println(\"println\");\n" + 
					"	        class Local {\n" + 
					"	        	void bar() {\n" + 
					"					new Y().bar();\n" + 
					"	        	}\n" + 
					"	        }\n" + 
					"			return super.equals(o);\n" + 
					"		}\n" + 
					"	};\n" + 
					"}"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 12)\n" + 
			"	new Y().bar();\n" + 
			"	^^^^^^^^^^^^^\n" + 
			"The method bar() from the type Y is deprecated\n" + 
			"----------\n"
 		);
 	}

	/**
	 * Bug 76324: [Javadoc] Wrongly reports invalid link format in @see and @link
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=76324">76324</a>
	 */
	public void testBug76324() {
		runConformTest(
			new String[] {
				"X.java",
				"\n" + 
					"/**\n" + 
					" * Subclasses perform GUI-related work in a dedicated thread. For instructions\n" + 
					" * on using this class, see\n" + 
					" * {@link <a  href=\"http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html\"> Swing tutorial </a>}\n" + 
					" * \n" + 
					" * @see <a\n" + 
					" *      href=\"http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html\">\n" + 
					" *      EDU.oswego.cs.dl.util.concurrent </a>\n" + 
					" * @see <a\n" + 
					" *      href=\"http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html\">\n" + 
					" *      JDK 5.0 </a>\n" + 
					" * @author {@link <a href=\"http://gee.cs.oswego.edu/dl\">Doug Lea</a>}\n" + 
					" * @author {@link <a href=\"http://home.pacbell.net/jfai\">J?rgen Failenschmid</a>}\n" + 
					"  *\n" + 
					"  * It is assumed that you have read the introductory document\n" + 
					"  * {@link <a HREF=\"../../../../../internat/overview.htm\">\n" + 
					"  * Internationalization</a>}\n" + 
					"  * and are familiar with \n" + 
					" */\n" + 
					"public class X {\n" + 
					"\n" + 
					"}\n"
			}
 		);
 	}
	// URL Link references
	public void testBug76324url() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
					"	/**\n" +
					"	 * Invalid inline URL link references \n" +
					"	 *\n" +
					"	 * {@link <}\n" +
					"	 * {@link <a}\n" +
					"	 * {@link <a hre}\n" +
					"	 * {@link <a href}\n" +
					"	 * {@link <a href=}\n" +
					"	 * {@link <a href=\"}\n" +
					"	 * {@link <a href=\"invalid}\n" +
					"	 * {@link <a href=\"invalid\"}\n" +
					"	 * {@link <a href=\"invalid\">}\n" +
					"	 * {@link <a href=\"invalid\">invalid}\n" +
					"	 * {@link <a href=\"invalid\">invalid<}\n" +
					"	 * {@link <a href=\"invalid\">invalid</}\n" +
					"	 * {@link <a href=\"invalid\">invalid</a}\n" +
					"	 * {@link <a href=\"invalid\">invalid</a> no text allowed after}\n" +
					"	 */\n" +
					"	public void s_foo() {\n" +
					"	}\n" +
					"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	* {@link <}\n" + 
				"	         ^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	* {@link <a}\n" + 
				"	         ^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	* {@link <a hre}\n" + 
				"	         ^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	* {@link <a href}\n" + 
				"	         ^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 9)\n" + 
				"	* {@link <a href=}\n" + 
				"	         ^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 10)\n" + 
				"	* {@link <a href=\"}\n" + 
				"	         ^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 11)\n" + 
				"	* {@link <a href=\"invalid}\n" + 
				"	         ^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 12)\n" + 
				"	* {@link <a href=\"invalid\"}\n" + 
				"	         ^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 13)\n" + 
				"	* {@link <a href=\"invalid\">}\n" + 
				"	         ^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 14)\n" + 
				"	* {@link <a href=\"invalid\">invalid}\n" + 
				"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"11. ERROR in X.java (at line 15)\n" + 
				"	* {@link <a href=\"invalid\">invalid<}\n" + 
				"	                                  ^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"12. ERROR in X.java (at line 16)\n" + 
				"	* {@link <a href=\"invalid\">invalid</}\n" + 
				"	                                  ^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"13. ERROR in X.java (at line 17)\n" + 
				"	* {@link <a href=\"invalid\">invalid</a}\n" + 
				"	                                  ^^^^\n" + 
				"Javadoc: Malformed link reference\n" + 
				"----------\n" + 
				"14. ERROR in X.java (at line 18)\n" + 
				"	* {@link <a href=\"invalid\">invalid</a> no text allowed after}\n" + 
				"	                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: Unexpected text\n" + 
				"----------\n"
		);
	}
	// String references
	public void testBug76324string() {
		runNegativeTest(
			new String[] {
			"X.java",
			"public class X {\n" +
			"	/**\n" + 
			"	 * Inline string references \n" + 
			"	 *\n" + 
			"	 * {@link \"}\n" + 
			"	 * {@link \"unterminated string}\n" + 
			"	 * {@link \"invalid string\"\"}\n" + 
			"	 * {@link \"valid string\"}\n" + 
			"	 * {@link \"invalid\" no text allowed after the string}\n" + 
			"	 */\n" + 
			"	public void s_foo() {\n" + 
			"	}\n" + 
			"}\n" },
			"----------\n" + 
			"1. ERROR in X.java (at line 5)\n" + 
			"	* {@link \"}\n" + 
			"	         ^^\n" + 
			"Javadoc: Invalid reference\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	* {@link \"unterminated string}\n" + 
			"	         ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid reference\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 7)\n" + 
			"	* {@link \"invalid string\"\"}\n" + 
			"	                         ^^\n" + 
			"Javadoc: Unexpected text\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 9)\n" + 
			"	* {@link \"invalid\" no text allowed after the string}\n" + 
			"	                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Unexpected text\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 77510: [javadoc] compiler wrongly report deprecation when option "process javadoc comments" is not set
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=77510">77510</a>
	 */
	public void testBug77510enabled() {
		runNegativeTest(
			new String[] {
				"A.java",
				"public class A {\n" + 
					"	/** \\u0009 @deprecated */\n" + 
					"	static int i0009;\n" + 
					"	/** \\u000a @deprecated */\n" + 
					"	static int i000a;\n" + 
					"	/** \\u000b @deprecated */\n" + 
					"	static int i000b;\n" + 
					"	/** \\u000c @deprecated */\n" + 
					"	static int i000c;\n" + 
					"	/** \\u001c @deprecated */\n" + 
					"	static int i001c;\n" + 
					"	/** \\u001d @deprecated */\n" + 
					"	static int i001d;\n" + 
					"	/** \\u001e @deprecated */\n" + 
					"	static int i001e;\n" + 
					"	/** \\u001f @deprecated */\n" + 
					"	static int i001f;\n" + 
					"	/** \\u2007 @deprecated */\n" + 
					"	static int i2007;\n" + 
					"	/** \\u202f @deprecated */\n" + 
					"	static int i202f;\n" + 
					"}\n",
				"X.java",
				"public class X {\n" + 
					"	int i0 = A.i0009;\n" + 
					"	int i1 = A.i000a;\n" + 
					"	int i2 = A.i000b;\n" + 
					"	int i3 = A.i000c;\n" + 
					"	int i4 = A.i001c;\n" + 
					"	int i5 = A.i001d;\n" + 
					"	int i6 = A.i001e;\n" + 
					"	int i7 = A.i001f;\n" + 
					"	int i8 = A.i2007;\n" + 
					"	int i9 = A.i202f;\n" + 
					"}\n" },
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	int i0 = A.i0009;\n" + 
			"	           ^^^^^\n" + 
			"The field A.i0009 is deprecated\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 3)\n" + 
			"	int i1 = A.i000a;\n" + 
			"	           ^^^^^\n" + 
			"The field A.i000a is deprecated\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	int i3 = A.i000c;\n" + 
			"	           ^^^^^\n" + 
			"The field A.i000c is deprecated\n" + 
			"----------\n"
		);
	}
	public void testBug77510disabled() {
		docCommentSupport = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"A.java",
				"public class A {\n" + 
					"	/** \\u0009 @deprecated */\n" + 
					"	static int i0009;\n" + 
					"	/** \\u000a @deprecated */\n" + 
					"	static int i000a;\n" + 
					"	/** \\u000b @deprecated */\n" + 
					"	static int i000b;\n" + 
					"	/** \\u000c @deprecated */\n" + 
					"	static int i000c;\n" + 
					"	/** \\u001c @deprecated */\n" + 
					"	static int i001c;\n" + 
					"	/** \\u001d @deprecated */\n" + 
					"	static int i001d;\n" + 
					"	/** \\u001e @deprecated */\n" + 
					"	static int i001e;\n" + 
					"	/** \\u001f @deprecated */\n" + 
					"	static int i001f;\n" + 
					"	/** \\u2007 @deprecated */\n" + 
					"	static int i2007;\n" + 
					"	/** \\u202f @deprecated */\n" + 
					"	static int i202f;\n" + 
					"}\n",
				"X.java",
				"public class X {\n" + 
					"	int i0 = A.i0009;\n" + 
					"	int i1 = A.i000a;\n" + 
					"	int i2 = A.i000b;\n" + 
					"	int i3 = A.i000c;\n" + 
					"	int i4 = A.i001c;\n" + 
					"	int i5 = A.i001d;\n" + 
					"	int i6 = A.i001e;\n" + 
					"	int i7 = A.i001f;\n" + 
					"	int i8 = A.i2007;\n" + 
					"	int i9 = A.i202f;\n" + 
					"}\n" },
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	int i0 = A.i0009;\n" + 
			"	           ^^^^^\n" + 
			"The field A.i0009 is deprecated\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 3)\n" + 
			"	int i1 = A.i000a;\n" + 
			"	           ^^^^^\n" + 
			"The field A.i000a is deprecated\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	int i3 = A.i000c;\n" + 
			"	           ^^^^^\n" + 
			"The field A.i000c is deprecated\n" + 
			"----------\n"
		);
	}
	
	/**
	 * Test bug 77260: [Javadoc] deprecation warning should not be reported when @deprecated tag is set
	 */
	public void testBug77260() {
		runConformTest(
			new String[] {
				"X.java",
				"/** @deprecated */\n" + 
					"public class X {\n" + 
					"	public int x;\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Y.java",
				"/**\n" + 
					" * @see X\n" + 
					" * @deprecated\n" + 
					" */\n" + 
					"public class Y {\n" + 
					"	/** @see X#x */\n" + 
					"	public int x;\n" + 
					"	/** @see X#foo() */\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Z.java",
				"public class Z {\n" + 
					"	/** \n" + 
					"	 * @see X#x\n" + 
					"	 * @deprecated\n" + 
					"	 */\n" + 
					"	public int x;\n" + 
					"	/**\n" + 
					"	 * @see X#foo()\n" + 
					"	 * @deprecated\n" + 
					"	 */\n" + 
					"	public void foo() {}\n" + 
					"}\n" }
		);
	}
	public void testBug77260nested() {
		Map options = getCompilerOptions();
		options.put(CompilerOptions.OPTION_ReportDeprecationInDeprecatedCode, CompilerOptions.ENABLED);
		runNegativeTest(
			new String[] {
				"X.java",
				"/** @deprecated */\n" + 
					"public class X {\n" + 
					"	public int x;\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Y.java",
				"/**\n" + 
					" * @see X\n" + 
					" * @deprecated\n" + 
					" */\n" + 
					"public class Y {\n" + 
					"	/** @see X#x */\n" + 
					"	public int x;\n" + 
					"	/** @see X#foo() */\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Z.java",
				"public class Z {\n" + 
					"	/** \n" + 
					"	 * @see X#x\n" + 
					"	 * @deprecated\n" + 
					"	 */\n" + 
					"	public int x;\n" + 
					"	/**\n" + 
					"	 * @see X#foo()\n" + 
					"	 * @deprecated\n" + 
					"	 */\n" + 
					"	public void foo() {}\n" + 
					"}\n" },
			"----------\n" + 
				"1. ERROR in Y.java (at line 2)\n" + 
				"	* @see X\n" + 
				"	       ^\n" + 
				"Javadoc: The type X is deprecated\n" + 
				"----------\n" + 
				"2. ERROR in Y.java (at line 6)\n" + 
				"	/** @see X#x */\n" + 
				"	         ^\n" + 
				"Javadoc: The type X is deprecated\n" + 
				"----------\n" + 
				"3. ERROR in Y.java (at line 6)\n" + 
				"	/** @see X#x */\n" + 
				"	           ^\n" + 
				"Javadoc: The field X.x is deprecated\n" + 
				"----------\n" + 
				"4. ERROR in Y.java (at line 8)\n" + 
				"	/** @see X#foo() */\n" + 
				"	         ^\n" + 
				"Javadoc: The type X is deprecated\n" + 
				"----------\n" + 
				"5. ERROR in Y.java (at line 8)\n" + 
				"	/** @see X#foo() */\n" + 
				"	           ^^^^^\n" + 
				"Javadoc: The method foo() from the type X is deprecated\n" + 
				"----------\n" + 
				"----------\n" + 
				"1. ERROR in Z.java (at line 3)\n" + 
				"	* @see X#x\n" + 
				"	       ^\n" + 
				"Javadoc: The type X is deprecated\n" + 
				"----------\n" + 
				"2. ERROR in Z.java (at line 3)\n" + 
				"	* @see X#x\n" + 
				"	         ^\n" + 
				"Javadoc: The field X.x is deprecated\n" + 
				"----------\n" + 
				"3. ERROR in Z.java (at line 8)\n" + 
				"	* @see X#foo()\n" + 
				"	       ^\n" + 
				"Javadoc: The type X is deprecated\n" + 
				"----------\n" + 
				"4. ERROR in Z.java (at line 8)\n" + 
				"	* @see X#foo()\n" + 
				"	         ^^^^^\n" + 
				"Javadoc: The method foo() from the type X is deprecated\n" + 
				"----------\n",
			null,
			true,
			options
		);
	}
	public void testBug77260nested_disabled() {
		Map options = getCompilerOptions();
		options.put(CompilerOptions.OPTION_ReportDeprecationInDeprecatedCode, CompilerOptions.ENABLED);
		options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsDeprecatedRef, CompilerOptions.DISABLED);
		runConformTest(
			new String[] {
				"X.java",
				"/** @deprecated */\n" + 
					"public class X {\n" + 
					"	public int x;\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Y.java",
				"/**\n" + 
					" * @see X\n" + 
					" * @deprecated\n" + 
					" */\n" + 
					"public class Y {\n" + 
					"	/** @see X#x */\n" + 
					"	public int x;\n" + 
					"	/** @see X#foo() */\n" + 
					"	public void foo() {}\n" + 
					"}\n",
				"Z.java",
				"public class Z {\n" + 
					"	/** \n" + 
					"	 * @see X#x\n" + 
					"	 * @deprecated\n" + 
					"	 */\n" + 
					"	public int x;\n" + 
					"	/**\n" + 
					"	 * @see X#foo()\n" + 
					"	 * @deprecated\n" + 
					"	 */\n" + 
					"	public void foo() {}\n" + 
					"}\n"
			},
			"",
			null,
			true,
			null,
			options,
			null
		);
	}

	/**
	 * Bug 77602: [javadoc] "Only consider members as visible as" is does not work for syntax error
	 */
	public void testBug77602() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"  /**\n" + 
					"   * @see\n" + 
					"   * @see UnknownClass\n" + 
					"   */\n" + 
					"  protected void foo() {\n" + 
					"  }\n" + 
				"}\n"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	* @see\n" + 
				"	   ^^^\n" + 
				"Javadoc: Missing reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	* @see UnknownClass\n" + 
				"	       ^^^^^^^^^^^^\n" + 
				"Javadoc: UnknownClass cannot be resolved to a type\n" + 
				"----------\n"
		);
	}
	public void testBug77602_Public() {
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"  /**\n" + 
					"   * @see\n" + 
					"   * @see UnknownClass\n" + 
					"   */\n" + 
					"  protected void foo() {\n" + 
					"  }\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 78091: [1.5][javadoc] Compiler should accept new 1.5 syntax for @param
	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=78091">78091</a>
	 */
	public void testBug78091() {
		reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
					"	/**\n" + 
					"	 * Valid type parameter reference\n" + 
					"	 * @param xxx.yyy invalid\n" + 
					"	 * @param obj(x) invalid\n" + 
					"	 */\n" + 
					"	public void foo(int xxx, Object obj) {}\n" + 
					"}"
			},
			"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	* @param xxx.yyy invalid\n" + 
				"	         ^^^^^^^\n" + 
				"Javadoc: Invalid param tag name\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	* @param obj(x) invalid\n" + 
				"	         ^^^^^^\n" + 
				"Javadoc: Invalid param tag name\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	public void foo(int xxx, Object obj) {}\n" + 
				"	                    ^^^\n" + 
				"Javadoc: Missing tag for parameter xxx\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 7)\n" + 
				"	public void foo(int xxx, Object obj) {}\n" + 
				"	                                ^^^\n" + 
				"Javadoc: Missing tag for parameter obj\n" + 
				"----------\n"
		);
	}

	/**
	 * Bug 80910: [javadoc] Invalid missing reference warning on @see or @link tags
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=80910"
	 */
	public void testBug80910() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
				"	int field;\n" + 
				"\n" + 
				"	/**\n" + 
				"	 * @param key\'s toto\n" + 
				"	 * @see #field\n" + 
				"	 */\n" + 
				"	public void foo(int x) {\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Test.java (at line 5)\n" + 
			"	* @param key\'s toto\n" + 
			"	         ^^^^^\n" + 
			"Javadoc: Invalid param tag name\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 82088: [search][javadoc] Method parameter types references not found in @see/@link tags
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=82088"
	 */
	public void testBug82088() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class Test {\n" + 
				"	int field;\n" + 
				"\n" + 
				"	/**\n" + 
				"	 * @param key\'s toto\n" + 
				"	 * @see #field\n" + 
				"	 */\n" + 
				"	public void foo(int x) {\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Test.java (at line 5)\n" + 
			"	* @param key\'s toto\n" + 
			"	         ^^^^^\n" + 
			"Javadoc: Invalid param tag name\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 83285: [javadoc] Javadoc reference to constructor of secondary type has no binding / not found by search
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=83285"
	 */
	public void testBug83285a() {
		runConformTest(
			new String[] {
				"p/A.java",
				"package p;\n" + 
				"class A { }\n" + 
				"class C {\n" + 
				"    /**\n" + 
				"     * Link {@link #C(String)} was also wrongly warned...\n" + 
				"     */\n" + 
				"    private String fGerman;\n" + 
				"    public C(String german) {\n" + 
				"        fGerman = german;\n" + 
				"    }\n" + 
				"}"
			}
		);
	}
	public void testBug83285b() {
		runConformTest(
			new String[] {
				"p/A.java",
				"package p;\n" + 
				"class A {\n" + 
				"	A(char c) {}\n" + 
				"}\n" + 
				"class B {\n" + 
				"	B(Exception ex) {}\n" + 
				"	void foo() {} \n" + 
				"	class C { \n" + 
				"	    /**\n" + 
				"	     * Link {@link #B(Exception)} OK\n" + 
				"	     * Link {@link #B.C(String)} OK\n" + 
				"	     * Link {@link #foo()} OK\n" + 
				"	     * Link {@link #bar()} OK\n" + 
				"	     */\n" + 
				"	    public C(String str) {}\n" + 
				"		void bar() {}\n" + 
				"	}\n" + 
				"}"
			}
		);
	}
	public void testBug83285c() {
		runNegativeTest(
			new String[] {
				"p/A.java",
				"package p;\n" + 
				"class A {\n" + 
				"	A(char c) {}\n" + 
				"}\n" + 
				"class B {\n" + 
				"	B(Exception ex) {}\n" + 
				"	void foo() {}\n" + 
				"	class C { \n" + 
				"	    /**\n" + 
				"	     * Link {@link #A(char)} KO\n" + 
				"	     * Link {@link #B(char)}  KO\n" + 
				"	     * Link {@link #C(char)} KO\n" + 
				"	     * Link {@link #foo(int)} KO\n" + 
				"	     * Link {@link #bar(int)} KO\n" + 
				"	     */\n" + 
				"	    public C(String str) {}\n" + 
				"		void bar() {}\n" + 
				"	}\n" + 
				"}"
			},
			"----------\n" + 
			"1. ERROR in p\\A.java (at line 10)\n" + 
			"	* Link {@link #A(char)} KO\n" + 
			"	               ^\n" + 
			"Javadoc: The method A(char) is undefined for the type B.C\n" + 
			"----------\n" + 
			"2. ERROR in p\\A.java (at line 11)\n" + 
			"	* Link {@link #B(char)}  KO\n" + 
			"	               ^\n" + 
			"Javadoc: The method B(char) is undefined for the type B.C\n" + 
			"----------\n" + 
			"3. ERROR in p\\A.java (at line 12)\n" + 
			"	* Link {@link #C(char)} KO\n" + 
			"	               ^^^^^^^\n" + 
			"Javadoc: The constructor B.C(char) is undefined\n" + 
			"----------\n" + 
			"4. ERROR in p\\A.java (at line 13)\n" + 
			"	* Link {@link #foo(int)} KO\n" + 
			"	               ^^^\n" + 
			"Javadoc: The method foo(int) is undefined for the type B.C\n" + 
			"----------\n" + 
			"5. ERROR in p\\A.java (at line 14)\n" + 
			"	* Link {@link #bar(int)} KO\n" + 
			"	               ^^^\n" + 
			"Javadoc: The method bar() in the type B.C is not applicable for the arguments (int)\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 87404: [javadoc] Unexpected not defined warning on constructor
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=87404"
	 */
	public void testBug87404() {
		runConformTest(
			new String[] {
				"p/A.java",
				"package p;\n" + 
				"class A {\n" + 
				"	A(char c) {}\n" + 
				"	class B {\n" + 
				"		B(Exception ex) {}\n" + 
				"	}\n" + 
				"	void foo() {}\n" + 
				"    /**\n" + 
				"     * Link {@link #A(char)} OK \n" + 
				"     * Link {@link #A(String)} OK\n" + 
				"     * Link {@link #foo()} OK\n" + 
				"     * Link {@link #bar()} OK\n" + 
				"     */\n" + 
				"    public A(String str) {}\n" + 
				"	void bar() {}\n" + 
				"}"
			}
		);
	}

	/**
	 * Bug 90302: [javadoc] {@inheritedDoc} should be inactive for non-overridden method
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=90302"
	 */
	public void testBug90302() {
		this.reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" + 
				" * @see #foo(String)\n" + 
				" */\n" + 
				"public class X {\n" + 
				"	/**\n" + 
				"	 * Static method\n" + 
				"	 * @param str\n" + 
				"	 * @return int\n" + 
				"	 * @throws NumberFormatException\n" + 
				"	 */\n" + 
				"	static int foo(String str) throws NumberFormatException{\n" + 
				"		return Integer.parseInt(str);\n" + 
				"	}\n" + 
				"}\n",
				"Y.java",
				"/**\n" + 
				" * @see #foo(String)\n" + 
				" */\n" + 
				"public class Y extends X { \n" + 
				"	/**\n" + 
				"	 * Static method: does not override super\n" + 
				"	 * {@inheritDoc}\n" + 
				"	 */\n" + 
				"	static int foo(String str) throws NumberFormatException{\n" + 
				"		return Integer.parseInt(str);\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Y.java (at line 7)\n" + 
			"	* {@inheritDoc}\n" + 
			"	    ^^^^^^^^^^\n" + 
			"Javadoc: Unexpected tag\n" + 
			"----------\n" + 
			"2. ERROR in Y.java (at line 9)\n" + 
			"	static int foo(String str) throws NumberFormatException{\n" + 
			"	       ^^^\n" + 
			"Javadoc: Missing tag for return type\n" + 
			"----------\n" + 
			"3. ERROR in Y.java (at line 9)\n" + 
			"	static int foo(String str) throws NumberFormatException{\n" + 
			"	                      ^^^\n" + 
			"Javadoc: Missing tag for parameter str\n" + 
			"----------\n" + 
			"4. ERROR in Y.java (at line 9)\n" + 
			"	static int foo(String str) throws NumberFormatException{\n" + 
			"	                                  ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Missing tag for declared exception NumberFormatException\n" + 
			"----------\n"
		);
	}
	public void testBug90302b() {
		this.reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"/** */\n" + 
				"public class X {\n" + 
				"}\n",
				"Y.java",
				"/**\n" + 
				" * @see #foo(String)\n" + 
				" */\n" + 
				"public class Y extends X { \n" + 
				"	/**\n" + 
				"	 * Simple method: does not override super\n" + 
				"	 * {@inheritDoc}\n" + 
				"	 */\n" + 
				"	static int foo(String str) throws NumberFormatException{\n" + 
				"		return Integer.parseInt(str);\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Y.java (at line 7)\n" + 
			"	* {@inheritDoc}\n" + 
			"	    ^^^^^^^^^^\n" + 
			"Javadoc: Unexpected tag\n" + 
			"----------\n" + 
			"2. ERROR in Y.java (at line 9)\n" + 
			"	static int foo(String str) throws NumberFormatException{\n" + 
			"	       ^^^\n" + 
			"Javadoc: Missing tag for return type\n" + 
			"----------\n" + 
			"3. ERROR in Y.java (at line 9)\n" + 
			"	static int foo(String str) throws NumberFormatException{\n" + 
			"	                      ^^^\n" + 
			"Javadoc: Missing tag for parameter str\n" + 
			"----------\n" + 
			"4. ERROR in Y.java (at line 9)\n" + 
			"	static int foo(String str) throws NumberFormatException{\n" + 
			"	                                  ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Missing tag for declared exception NumberFormatException\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 103304: [Javadoc] Wrong reference proposal for inner classes.
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=103304"
	 */
	public void testBug103304a() {
		runNegativeTest(
			new String[] {
				"boden/IAFAState.java",
				"package boden;\n" + 
				"public interface IAFAState {\n" + 
				"    public class ValidationException extends Exception {\n" + 
				"        public ValidationException(String variableName, IAFAState subformula) {\n" + 
				"            super(\"Variable \'\"+variableName+\"\' may be unbound in \'\"+subformula+\"\'\");\n" + 
				"        }\n" + 
				"        public void method() {}\n" + 
				"    }\n" + 
				"    /**\n" + 
				"     * Validates a formula for consistent bindings. Bindings are consistent, when at each point in time,\n" + 
				"     * the set of povided variables can be guaranteed to be a superset of the set of required variables.\n" + 
				"     * @throws ValidationException Thrown if a variable is unbound. \n" + 
				"     * @see ValidationException#IAFAState.ValidationException(String, IAFAState)\n" + 
				"     * @see IAFAState.ValidationException#method()\n" + 
				"     * @see ValidationException\n" + 
				"     * {@link ValidationException}\n" + 
				"     */\n" + 
				"    public void validate() throws ValidationException;\n" + 
				"}\n",
				"boden/TestValid.java",
				"package boden;\n" + 
				"import boden.IAFAState.ValidationException;\n" + 
				"/**\n" + 
				" * @see ValidationException\n" + 
				" * @see IAFAState.ValidationException\n" + 
				" */\n" + 
				"public class TestValid {\n" + 
				"	/**  \n" + 
				"	 * @see ValidationException#IAFAState.ValidationException(String, IAFAState)\n" + 
				"	 */\n" + 
				"	IAFAState.ValidationException valid1;\n" + 
				"	/**\n" + 
				"	 * @see IAFAState.ValidationException#IAFAState.ValidationException(String, IAFAState)\n" + 
				"	 */\n" + 
				"	IAFAState.ValidationException valid2;\n" + 
				"}\n"
			},
			//boden\TestValid.java:8: warning - Tag @see: reference not found: ValidationException
			//boden\TestValid.java:12: warning - Tag @see: reference not found: ValidationException#IAFAState.ValidationException(String, IAFAState)
			"----------\n" + 
			"1. ERROR in boden\\TestValid.java (at line 4)\n" + 
			"	* @see ValidationException\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n" + 
			"2. ERROR in boden\\TestValid.java (at line 9)\n" + 
			"	* @see ValidationException#IAFAState.ValidationException(String, IAFAState)\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n"
		);
	}
	public void testBug103304b() {
		runNegativeTest(
			new String[] {
				"boden/IAFAState.java",
				"package boden;\n" + 
				"public interface IAFAState {\n" + 
				"    public class ValidationException extends Exception {\n" + 
				"        public ValidationException(String variableName, IAFAState subformula) {\n" + 
				"            super(\"Variable \'\"+variableName+\"\' may be unbound in \'\"+subformula+\"\'\");\n" + 
				"        }\n" + 
				"        public void method() {}\n" + 
				"    }\n" + 
				"}\n",
				"boden/TestInvalid1.java",
				"package boden;\n" + 
				"import boden.IAFAState.ValidationException;\n" + 
				"public class TestInvalid1 {\n" + 
				"	/** \n" + 
				"	 * @see ValidationException#ValidationException(String, IAFAState)\n" + 
				"	 */ \n" + 
				"	IAFAState.ValidationException invalid;\n" + 
				"}\n",
				"boden/TestInvalid2.java",
				"package boden;\n" + 
				"public class TestInvalid2 {\n" + 
				"	/**\n" + 
				"	 * @see IAFAState.ValidationException#ValidationException(String, IAFAState)\n" + 
				"	 */\n" + 
				"	IAFAState.ValidationException invalid;\n" + 
				"}\n",
				"boden/TestInvalid3.java",
				"package boden;\n" + 
				"import boden.IAFAState.ValidationException;\n" + 
				"public class TestInvalid3 {\n" + 
				"	/**\n" + 
				"	 * @see IAFAState.ValidationException#IAFA.State.ValidationException(String, IAFAState)\n" + 
				"	 */\n" + 
				"	IAFAState.ValidationException invalid;\n" + 
				"}\n",
				"boden/TestInvalid4.java",
				"package boden;\n" + 
				"import boden.IAFAState.ValidationException;\n" + 
				"public class TestInvalid4 {\n" + 
				"	/**\n" + 
				"	 * @see IAFAState.ValidationException#IAFAState .ValidationException(String, IAFAState)\n" + 
				"	 */\n" + 
				"	IAFAState.ValidationException invalid;\n" + 
				"}\n"
			},
			//boden\TestInvalid1.java:7: warning - Tag @see: reference not found: ValidationException#ValidationException(String, IAFAState)
			//boden\TestInvalid2.java:6: warning - Tag @see: can't find ValidationException(String, IAFAState) in boden.IAFAState.ValidationException => bug ID: 4288720
			//boden\TestInvalid3.java:6: warning - Tag @see: can't find IAFA.State.ValidationException(String, IAFAState) in boden.IAFAState.ValidationException
			//boden\TestInvalid4.java:6: warning - Tag @see: can't find IAFAState in boden.IAFAState.ValidationException
			"----------\n" + 
			"1. ERROR in boden\\TestInvalid1.java (at line 5)\n" + 
			"	* @see ValidationException#ValidationException(String, IAFAState)\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in boden\\TestInvalid3.java (at line 5)\n" + 
			"	* @see IAFAState.ValidationException#IAFA.State.ValidationException(String, IAFAState)\n" + 
		"	                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in boden\\TestInvalid4.java (at line 5)\n" + 
			"	* @see IAFAState.ValidationException#IAFAState .ValidationException(String, IAFAState)\n" + 
			"	                                     ^^^^^^^^^\n" + 
			"Javadoc: IAFAState cannot be resolved or is not a field\n" + 
			"----------\n"
		);
	}
	public void testBug103304c() {
		runConformTest(
			new String[] {
				"test/Test.java",
				"package test;\n" + 
				"public interface Test {\n" + 
				"	public class Level0 {\n" + 
				"		public Level0() {}\n" + 
				"	}\n" + 
				"	public interface Member {\n" + 
				"		public class Level1 {\n" + 
				"			public Level1() {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test/C.java",
				"package test;\n" + 
				"public class C {\n" + 
				"	/**\n" + 
				"	 * @see Test.Level0#Test.Level0()\n" + 
				"	 */\n" + 
				"	Test.Level0 valid = new Test.Level0();\n" + 
				"	/**\n" + 
				"	 * @see Test.Level0#Level0()\n" + 
				"	 */\n" + 
				"	Test.Level0 invalid = new Test.Level0();\n" + 
				"}\n"
			}
			//test\C.java:10: warning - Tag @see: can't find Level0() in test.Test.Level0 => bug ID: 4288720
		);
	}
	public void testBug103304d() {
		runNegativeTest(
			new String[] {
				"test/Test.java",
				"package test;\n" + 
				"public interface Test {\n" + 
				"	public class Level0 {\n" + 
				"		public Level0() {}\n" + 
				"	}\n" + 
				"	public interface Member {\n" + 
				"		public class Level1 {\n" + 
				"			public Level1() {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test/C2.java",
				"package test;\n" + 
				"public class C2 {\n" + 
				"	/**\n" + 
				"	 * @see Test.Member.Level1#Test.Member.Level1()\n" + 
				"	 */\n" + 
				"	Test.Member.Level1 valid = new Test.Member.Level1();\n" + 
				"	/**\n" + 
				"	 * @see Test.Member.Level1#Level1()\n" + 
				"	 */\n" + 
				"	Test.Member.Level1 invalid = new Test.Member.Level1();\n" + 
				"	/**\n" + 
				"	 * @see Test.Member.Level1#Test.Level1()\n" + 
				"	 */\n" + 
				"	Test.Member.Level1 wrong = new Test.Member.Level1();\n" + 
				"}\n"
			},
			//test\C2.java:10: warning - Tag @see: can't find Level1() in test.Test.Member.Level1 => Bug ID: 4288720
			//test\C2.java:14: warning - Tag @see: can't find Test.Level1() in test.Test.Member.Level1
			"----------\n" + 
			"1. ERROR in test\\C2.java (at line 12)\n" + 
			"	* @see Test.Member.Level1#Test.Level1()\n" + 
			"	                          ^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n"
		);
	}
	public void testBug103304e() {
		runConformTest(
			new String[] {
				"implicit/Valid.java",
				"package implicit;\n" + 
				"public interface Valid {\n" + 
				"	public class Level0 {\n" + 
				"		/**\n" + 
				"		 * @see #Valid.Level0() Valid\n" + 
				"		 */\n" + 
				"		public Level0() {}\n" + 
				"		/**\n" + 
				"		 * @see #Valid.Level0(String) Valid\n" + 
				"		 */\n" + 
				"		public Level0(String str) {}\n" + 
				"	}\n" + 
				"	public interface Member {\n" + 
				"		public class Level1 {\n" + 
				"			/**\n" + 
				"			 * @see #Valid.Member.Level1() Valid\n" + 
				"			 */\n" + 
				"			public Level1() {}\n" + 
				"			/**\n" + 
				"			 * @see #Valid.Member.Level1(int) Valid\n" + 
				"			 */\n" + 
				"			public Level1(int x) {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n"
			}
		);
	}
	public void testBug103304f() {
		runNegativeTest(
			new String[] {
				"implicit/Invalid.java",
				"package implicit;\n" + 
				"public interface Invalid {\n" + 
				"	public class Level0 {\n" + 
				"		/**\n" + 
				"		 * @see #Level0() Invalid\n" + 
				"		 */\n" + 
				"		public Level0() {}\n" + 
				"		/**\n" + 
				"		 * @see #Level0(String) Invalid\n" + 
				"		 */\n" + 
				"		public Level0(String str) {}\n" + 
				"	}\n" + 
				"	public interface Member {\n" + 
				"		public class Level1 {\n" + 
				"			/**\n" + 
				"			 * @see #Level1() Invalid\n" + 
				"			 * @see #Member.Level1() Invalid\n" + 
				"			 * @see #Invalid.Level1() Invalid\n" + 
				"			 */\n" + 
				"			public Level1() {}\n" + 
				"			/**\n" + 
				"			 * @see #Level1(int) Invalid\n" + 
				"			 * @see #Invalid.Level1(int) Invalid\n" + 
				"			 * @see #Member.Level1(int) Invalid\n" + 
				"			 */\n" + 
				"			public Level1(int x) {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n"
			},
			//implicit\Invalid.java:7: warning - Tag @see: can't find Level0() in implicit.Invalid.Level0 => bug ID: 4288720
			//implicit\Invalid.java:11: warning - Tag @see: can't find Level0(String) in implicit.Invalid.Level0 => bug ID: 4288720
			//implicit\Invalid.java:20: warning - Tag @see: can't find Level1() in implicit.Invalid.Member.Level1 => bug ID: 4288720
			//implicit\Invalid.java:20: warning - Tag @see: can't find Member.Level1() in implicit.Invalid.Member.Level1
			//implicit\Invalid.java:20: warning - Tag @see: can't find Invalid.Level1() in implicit.Invalid.Member.Level1
			//implicit\Invalid.java:26: warning - Tag @see: can't find Level1(int) in implicit.Invalid.Member.Level1 => bug ID: 4288720
			//implicit\Invalid.java:26: warning - Tag @see: can't find Invalid.Level1(int) in implicit.Invalid.Member.Level1
			//implicit\Invalid.java:26: warning - Tag @see: can't find Member.Level1(int) in implicit.Invalid.Member.Level1
			"----------\n" + 
			"1. ERROR in implicit\\Invalid.java (at line 17)\n" + 
			"	* @see #Member.Level1() Invalid\n" + 
			"	        ^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n" + 
			"2. ERROR in implicit\\Invalid.java (at line 18)\n" + 
			"	* @see #Invalid.Level1() Invalid\n" + 
			"	        ^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n" + 
			"3. ERROR in implicit\\Invalid.java (at line 23)\n" + 
			"	* @see #Invalid.Level1(int) Invalid\n" + 
			"	        ^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n" + 
			"4. ERROR in implicit\\Invalid.java (at line 24)\n" + 
			"	* @see #Member.Level1(int) Invalid\n" + 
			"	        ^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: Invalid member type qualification\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 116464: [javadoc] Unicode tag name are not correctly parsed
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=116464"
	 */
	public void testBug116464() {
		this.reportMissingJavadocTags = CompilerOptions.ERROR;
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @\\u0070\\u0061\\u0072\\u0061\\u006d str xxx\n" + 
				"	 */\n" + 
				"	void foo(String str) {}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 125903: [javadoc] Treat whitespace in javadoc tags as invalid tags
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=125903"
	 */
	public void testBug125903() {
		this.reportMissingJavadocTags = CompilerOptions.ERROR;
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" + 
				" * {@ link java.lang.String}\n" + 
				" * @ since 2.1\n" + 
				" */\n" + 
				"public class X {\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	* {@ link java.lang.String}\n" + 
			"	   ^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 3)\n" + 
			"	* @ since 2.1\n" + 
			"	  ^^\n" + 
			"Javadoc: Invalid tag\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 128954: Javadoc problems with category CAT_INTERNAL
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=128954"
	 */
	public void testBug128954() {
		this.reportInvalidJavadoc = CompilerOptions.WARNING;
		this.reportDeprecation = CompilerOptions.WARNING;
		runNegativeTest(
			new String[] {
				"X.java", //========================
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see p.A#bar()\n" + 
				"	 */\n" + 
				"	void foo() {\n" + 
				"		Zork z;\n" +
				"	}\n" + 
				"}\n",
				"p/A.java",  //========================
				"package p;\n" +
				"public class A {\n" + 
				"	/** @deprecated */\n" +
				"	public void bar() {\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	* @see p.A#bar()\n" + 
			"	           ^^^^^\n" + 
			"[@cat:javadoc] Javadoc: The method bar() from the type A is deprecated\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"[@cat:type] Zork cannot be resolved to a type\n" + 
			"----------\n",
			null,
			true,
			null,
			false,
			true,
			true);
	}	
	/**
	 * Bug 128954: Javadoc problems with category CAT_INTERNAL - variation
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=128954" 
	 */
	public void testBug128954a() {
		this.reportInvalidJavadoc = CompilerOptions.WARNING;
		this.reportDeprecation = CompilerOptions.WARNING;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	\n" + 
				"	/**\n" + 
				"	 * @see p.A#bar()\n" + 
				"	 */\n" + 
				"	void foo() {\n" + 
				"		Zork z;\n" +
				"	}\n" + 
				"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	* @see p.A#bar()\n" + 
			"	       ^^^\n" + 
			"[@cat:javadoc] Javadoc: p cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"[@cat:type] Zork cannot be resolved to a type\n" + 
			"----------\n",
			null,
			true,
			null,
			false,
			true,
			true);
	}	

	/**
	 * Bug 129241: [Javadoc] deprecation warning wrongly reported when ignoring Malformed Javadoc comments
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=129241"
	 */
	public void testBug129241a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see p.A#bar\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n",
				"p/A.java",
				"package p;\n" +
				"/** @deprecated */\n" +
				"public class A {\n" + 
				"	void bar() {}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	* @see p.A#bar\n" + 
			"	       ^^^\n" + 
			"Javadoc: The type A is deprecated\n" + 
			"----------\n"
		);
	}
	public void testBug129241b() {
		this.reportDeprecation = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see p.A#bar\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n",
				"p/A.java",
				"package p;\n" +
				"/** @deprecated */\n" +
				"public class A {\n" + 
				"	void bar() {}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	* @see p.A#bar\n" + 
			"	       ^^^\n" + 
			"Javadoc: The type A is deprecated\n" + 
			"----------\n"
		);
	}
	public void testBug129241c() {
		this.reportJavadocDeprecation = CompilerOptions.DISABLED;
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see p.A#bar\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n",
				"p/A.java",
				"package p;\n" +
				"/** @deprecated */\n" +
				"public class A {\n" + 
				"	void bar() {}\n" + 
				"}\n"
			}
		);
	}
	public void testBug129241d() {
		this.reportInvalidJavadoc = CompilerOptions.IGNORE;
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	/**\n" + 
				"	 * @see p.A#bar\n" + 
				"	 */\n" + 
				"	void foo() {}\n" + 
				"}\n",
				"p/A.java",
				"package p;\n" +
				"/** @deprecated */\n" +
				"public class A {\n" + 
				"	void bar() {}\n" + 
				"}\n"
			}
		);
	}

	/**
	 * Bug 132813: NPE in Javadoc.resolve(Javadoc.java:196) + log swamped
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=132813"
	 */
	public void testBug132813() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"public class X { \n" + 
				"	/**	 */ \n" + 
				"	public Test() {}\n" + 
				"	/**	 */\n" + 
				"	public test() {}\n" + 
				"}\n"			},
			"----------\n" + 
			"1. ERROR in Test.java (at line 1)\n" + 
			"	public class X { \n" + 
			"	             ^\n" + 
			"The public type X must be defined in its own file\n" + 
			"----------\n" + 
			"2. ERROR in Test.java (at line 3)\n" + 
			"	public Test() {}\n" + 
			"	       ^^^^^^\n" + 
			"Return type for the method is missing\n" + 
			"----------\n" + 
			"3. ERROR in Test.java (at line 5)\n" + 
			"	public test() {}\n" + 
			"	       ^^^^^^\n" + 
			"Return type for the method is missing\n" + 
			"----------\n"
		);
	}

	/**
	 * Bug 149013: [javadoc] In latest 3.3 build, there is a javadoc error in org.eclipse.core.resources
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=149013"
	 */
	public void testBug149013_Private01() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runConformTest(
			new String[] {
				"test1/X.java",
				"package test1;\n" + 
				"public class X {\n" + 
				"	class Inner {\n" + 
				"		class Level2 {\n" + 
				"			class Level3 {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test1/Test.java",
				"package test1;\n" + 
				"/**\n" + 
				" * @see X.Inner\n" + 
				" * @see X.Inner.Level2\n" + 
				" * @see X.Inner.Level2.Level3\n" + 
				" */\n" + 
				"public class Test {}\n",
				"test1/X.java"
			}
		);
	}
	public void testBug149013_Public01() {
		this.reportMissingJavadocTags = CompilerOptions.DISABLED;
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test1/X.java",
				"package test1;\n" + 
				"public class X {\n" + 
				"	class Inner {\n" + 
				"		class Level2 {\n" + 
				"			class Level3 {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test1/Test.java",
				"package test1;\n" + 
				"/**\n" + 
				" * @see X.Inner\n" + 
				" * @see X.Inner.Level2\n" + 
				" * @see X.Inner.Level2.Level3\n" + 
				" */\n" + 
				"public class Test {\n" + 
				"}\n"
			},
			//test1\Test.java:7: warning - Tag @see: reference not found: X.Inner
			//test1\Test.java:7: warning - Tag @see: reference not found: X.Inner.Level2
			//test1\Test.java:7: warning - Tag @see: reference not found: X.Inner.Level2.Level3
			"----------\n" + 
			"1. ERROR in test1\\Test.java (at line 3)\n" + 
			"	* @see X.Inner\n" + 
			"	       ^^^^^^^\n" + 
			"Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" + 
			"----------\n" + 
			"2. ERROR in test1\\Test.java (at line 4)\n" + 
			"	* @see X.Inner.Level2\n" + 
			"	       ^^^^^^^^^^^^^^\n" + 
			"Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" + 
			"----------\n" + 
			"3. ERROR in test1\\Test.java (at line 5)\n" + 
			"	* @see X.Inner.Level2.Level3\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" + 
			"----------\n"
		);
	}
	public void testBug149013_Private02() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"test1/X.java",
				"package test1;\n" + 
				"public class X {\n" + 
				"	class Inner {\n" + 
				"		class Level2 {\n" + 
				"			class Level3 {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test2/Test.java",
				"package test2;\n" + 
				"import test1.X;\n" + 
				"/**\n" + 
				" * @see X.Inner\n" + 
				" * @see X.Inner.Level2\n" + 
				" * @see X.Inner.Level2.Level3\n" + 
				" */\n" + 
				"public class Test {}\n",
			},
			//test2\Test.java:10: warning - Tag @see: reference not found: X.Inner
			//test2\Test.java:10: warning - Tag @see: reference not found: X.Inner.Level2
			//test2\Test.java:10: warning - Tag @see: reference not found: X.Inner.Level2.Level3
			"----------\n" + 
			"1. ERROR in test2\\Test.java (at line 4)\r\n" + 
			"	* @see X.Inner\r\n" + 
			"	       ^^^^^^^\n" + 
			"Javadoc: The type X.Inner is not visible\n" + 
			"----------\n" + 
			"2. ERROR in test2\\Test.java (at line 5)\r\n" + 
			"	* @see X.Inner.Level2\r\n" + 
			"	       ^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type X.Inner is not visible\n" + 
			"----------\n" + 
			"3. ERROR in test2\\Test.java (at line 6)\r\n" + 
			"	* @see X.Inner.Level2.Level3\r\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type X.Inner is not visible\n" + 
			"----------\n"
		);
	}
	public void testBug149013_Public02() {
		this.reportMissingJavadocTags = CompilerOptions.DISABLED;
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test1/X.java",
				"package test1;\n" + 
				"public class X {\n" + 
				"	class Inner {\n" + 
				"		class Level2 {\n" + 
				"			class Level3 {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test2/Test.java",
				"package test2;\n" + 
				"import test1.X;\n" + 
				"/**\n" + 
				" * @see X.Inner\n" + 
				" * @see X.Inner.Level2\n" + 
				" * @see X.Inner.Level2.Level3\n" + 
				" */\n" + 
				"public class Test {}\n",
			},
			//test2\Test.java:10: warning - Tag @see: reference not found: X.Inner
			//test2\Test.java:10: warning - Tag @see: reference not found: X.Inner.Level2
			//test2\Test.java:10: warning - Tag @see: reference not found: X.Inner.Level2.Level3
			"----------\n" + 
			"1. ERROR in test2\\Test.java (at line 4)\r\n" + 
			"	* @see X.Inner\r\n" + 
			"	       ^^^^^^^\n" + 
			"Javadoc: The type X.Inner is not visible\n" + 
			"----------\n" + 
			"2. ERROR in test2\\Test.java (at line 5)\r\n" + 
			"	* @see X.Inner.Level2\r\n" + 
			"	       ^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type X.Inner is not visible\n" + 
			"----------\n" + 
			"3. ERROR in test2\\Test.java (at line 6)\r\n" + 
			"	* @see X.Inner.Level2.Level3\r\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type X.Inner is not visible\n" + 
			"----------\n"
		);
	}
	public void testBug149013_Private03() {
		this.reportMissingJavadocTags = CompilerOptions.IGNORE;
		runNegativeTest(
			new String[] {
				"test1/X.java",
				"package test1;\n" + 
				"public class X {\n" + 
				"	class Inner {\n" + 
				"		class Level2 {\n" + 
				"			class Level3 {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test3/Test.java",
				"package test3;\n" + 
				"/**\n" + 
				" * @see test1.X.Inner\n" + 
				" * @see test1.X.Inner.Level2\n" + 
				" * @see test1.X.Inner.Level2.Level3\n" + 
				" */\n" + 
				"public class Test {}\n"
			},
			// no warning
			"----------\n" + 
			"1. ERROR in test3\\Test.java (at line 3)\r\n" + 
			"	* @see test1.X.Inner\r\n" + 
			"	       ^^^^^^^^^^^^^\n" + 
			"Javadoc: The type test1.X.Inner is not visible\n" + 
			"----------\n" + 
			"2. ERROR in test3\\Test.java (at line 4)\r\n" + 
			"	* @see test1.X.Inner.Level2\r\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type test1.X.Inner is not visible\n" + 
			"----------\n" + 
			"3. ERROR in test3\\Test.java (at line 5)\r\n" + 
			"	* @see test1.X.Inner.Level2.Level3\r\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type test1.X.Inner is not visible\n" + 
			"----------\n"
		);
	}
	public void testBug149013_Public03() {
		this.reportMissingJavadocTags = CompilerOptions.DISABLED;
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(
			new String[] {
				"test1/X.java",
				"package test1;\n" + 
				"public class X {\n" + 
				"	class Inner {\n" + 
				"		class Level2 {\n" + 
				"			class Level3 {}\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",
				"test3/Test.java",
				"package test3;\n" + 
				"/**\n" + 
				" * @see test1.X.Inner\n" + 
				" * @see test1.X.Inner.Level2\n" + 
				" * @see test1.X.Inner.Level2.Level3\n" + 
				" */\n" + 
				"public class Test {}\n"
			},
			// no warning
			"----------\n" + 
			"1. ERROR in test3\\Test.java (at line 3)\r\n" + 
			"	* @see test1.X.Inner\r\n" + 
			"	       ^^^^^^^^^^^^^\n" + 
			"Javadoc: The type test1.X.Inner is not visible\n" + 
			"----------\n" + 
			"2. ERROR in test3\\Test.java (at line 4)\r\n" + 
			"	* @see test1.X.Inner.Level2\r\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type test1.X.Inner is not visible\n" + 
			"----------\n" + 
			"3. ERROR in test3\\Test.java (at line 5)\r\n" + 
			"	* @see test1.X.Inner.Level2.Level3\r\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Javadoc: The type test1.X.Inner is not visible\n" + 
			"----------\n"
		);
	}

	/**
	 * @bug 153399: [javadoc] JDT Core should warn if the @value tag is not used correctly
	 * @test Ensure that 'value' tag is well warned when not used correctly
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=153399"
	 */
	public void testBug153399a() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X { \n" + 
			"	/**\n" + 
			"	 * {@value #MY_VALUE}\n" + 
			"	 */\n" + 
			"	public final static int MY_VALUE = 0; \n" + 
			"	/**\n" + 
			"	 * {@value #MY_VALUE}\n" + 
			"	 */\n" + 
			"	public void foo() {}\n" + 
			"	/**\n" + 
			"	 * {@value #MY_VALUE}\n" + 
			"	 */\n" + 
			"	class Sub {} \n" + 
			"}\n"
		};
		if (complianceLevel.equals(COMPLIANCE_1_3) || complianceLevel.equals(COMPLIANCE_1_4)) {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 7)\n" + 
				"	* {@value #MY_VALUE}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 11)\n" + 
				"	* {@value #MY_VALUE}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n"
			);
		} else {
			runConformTest(testFiles);
		}
	}
	public void testBug153399b() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X { \n" + 
			"	/**\n" + 
			"	 * {@value}\n" + 
			"	 */\n" + 
			"	public final static int MY_VALUE = 0; \n" + 
			"	/**\n" + 
			"	 * {@value}\n" + 
			"	 */\n" + 
			"	public void foo() {}\n" + 
			"	/**\n" + 
			"	 * {@value}\n" + 
			"	 */\n" + 
			"	class Sub {} \n" + 
			"}\n"
		};
		if (complianceLevel.equals(COMPLIANCE_1_3) || complianceLevel.equals(COMPLIANCE_1_4)) {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 7)\n" + 
				"	* {@value}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 11)\n" + 
				"	* {@value}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n"
			);
		} else {
			runConformTest(testFiles);
		}
	}
	public void testBug153399c() {
		String[] testFiles = new String[] {
			"p1/X.java",
			"package p1;\n" + 
			"public class X {\n" + 
			"	/**\n" + 
			"	 * @return a\n" + 
			"	 */\n" + 
			"	boolean get() {\n" + 
			"		return false;\n" + 
			"	}\n" + 
			"}\n"
		};
		runConformTest(testFiles);
	}
	public void testBug153399d() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X { \n" + 
			"	/**\n" + 
			"	 * {@value #MY_VALUE}\n" + 
			"	 * {@value}\n" + 
			"	 * {@value Invalid}\n" + 
			"	 */\n" + 
			"	public final static int MY_VALUE = 0; \n" + 
			"}\n"
		};
		if (complianceLevel.equals(COMPLIANCE_1_3) || complianceLevel.equals(COMPLIANCE_1_4)) {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	* {@value #MY_VALUE}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	* {@value}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n"
			);
		} else {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	* {@value Invalid}\n" + 
				"	          ^^^^^^^^\n" + 
				"Javadoc: Invalid reference\n" + 
				"----------\n"
			);
		}
	}
	public void testBug153399e() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X { \n" + 
			"	/**\n" + 
			"	 * {@value Invalid}\n" + 
			"	 * {@value #MY_VALUE}\n" + 
			"	 */\n" + 
			"	public final static int MY_VALUE = 0; \n" + 
			"}\n"
		};
		if (complianceLevel.equals(COMPLIANCE_1_3) || complianceLevel.equals(COMPLIANCE_1_4)) {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	* {@value Invalid}\n" + 
				"	    ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n"
			);
		} else {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	* {@value Invalid}\n" + 
				"	          ^^^^^^^^\n" + 
				"Javadoc: Invalid reference\n" + 
				"----------\n"
			);
		}
	}

	/**
	 * @bug 160015: [1.5][javadoc] Missing warning on autoboxing compatible methods
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=160015"
	 */
	public void testBug160015() {
		runNegativeTest(new String[] {
				"Test.java",
				"/**\n" + 
				" * @see #method(Long) Warning!\n" + 
				" */\n" + 
				"public class Test {\n" + 
				"	public void method(long l) {}\n" + 
				"	/**\n" + 
				"	 * @see #method(Long) Warning!\n" + 
				"	 */\n" + 
				"	void bar() {}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in Test.java (at line 2)\n" + 
			"	* @see #method(Long) Warning!\n" + 
			"	        ^^^^^^\n" + 
			"Javadoc: The method method(long) in the type Test is not applicable for the arguments (Long)\n" + 
			"----------\n" + 
			"2. ERROR in Test.java (at line 7)\n" + 
			"	* @see #method(Long) Warning!\n" + 
			"	        ^^^^^^\n" + 
			"Javadoc: The method method(long) in the type Test is not applicable for the arguments (Long)\n" + 
			"----------\n"
		);
	}

	/**
	 * @bug 163659: [javadoc] Compiler should warn when method parameters are not identical
	 * @test Ensure that a warning is raised when method parameter types are not identical
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=163659"
	 */
	public void testBug163659() {
		runNegativeTest(
			new String[] {
				"Test.java",
				"/**\n" + 
				" * @see #foo(MyInterface)\n" + 
				" * @see #foo(MySubInterface)\n" + 
				" */\n" + 
				"public class Test {\n" + 
				"	public void foo(MyInterface mi) {\n" + 
				"	}\n" + 
				"}\n" + 
				"interface MyInterface {}\n" + 
				"interface MySubInterface extends MyInterface {} \n"
			},
			"----------\n" + 
			"1. ERROR in Test.java (at line 3)\n" + 
			"	* @see #foo(MySubInterface)\n" + 
			"	        ^^^\n" + 
			"Javadoc: The method foo(MyInterface) in the type Test is not applicable for the arguments (MySubInterface)\n" + 
			"----------\n"
		);
	}

	/**
	 * @bug 165794: [javadoc] Should not report ambiguous on method with parameterized types as parameters
	 * @test Ensure that no warning are raised when ambiguous parameterized methods are present in javadoc comments
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=165794"
	 */
	public void testBug165794() {
		String[] testFiles = new String[] {
			"X.java",
			"/**\n" + 
			" * No reasonable hint for resolving the {@link #getMax(A)}.\n" + 
			" */\n" + 
			"public class X {\n" + 
			"    /**\n" + 
			"     * Extends Number method.\n" + 
			"     * @see #getMax(A ipZ)\n" + 
			"     */\n" + 
			"    public <T extends Y> T getMax(final A<T> ipY) {\n" + 
			"        return ipY.t();\n" + 
			"    }\n" + 
			"    \n" + 
			"    /**\n" + 
			"     * Extends Exception method.\n" + 
			"     * @see #getMax(A ipY)\n" + 
			"     */\n" + 
			"    public <T extends Z> T getMax(final A<T> ipZ) {\n" + 
			"        return ipZ.t();\n" + 
			"    }\n" + 
			"}\n" + 
			"class A<T> {\n" + 
			"	T t() { return null; }\n" + 
			"}\n" + 
			"class Y {}\n" + 
			"class Z {}"
		};
		if (complianceLevel.equals(COMPLIANCE_1_3) || complianceLevel.equals(COMPLIANCE_1_4)) {
			return;
		}
		runConformTest(testFiles);
	}

	/**
	 * @bug 166365: [javadoc] severity level of malformed javadoc comments did not work properly
	 * @test Ensure that no warning is raised when visibility is lower than the javadoc option one
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=166365"
	 */
	public void testBug166365() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X {\n" + 
			"    /**\n" + 
			"     * @return\n" + 
			"     */\n" + 
			"    private String getSomePrivate() {\n" + 
			"        return \"SomePrivate\";\n" + 
			"    }\n" + 
			"    /**\n" + 
			"     * @return\n" + 
			"     */\n" + 
			"    protected String getSomeProtected() {\n" + 
			"        return \"SomeProtected\";\n" + 
			"    }\n" + 
			"    /**\n" + 
			"     * @return\n" + 
			"     */\n" + 
			"    String getSomeDefault() {\n" + 
			"        return \"SomeDefault\";\n" + 
			"    }\n" + 
			"    /**\n" + 
			"     * @return\n" + 
			"     */\n" + 
			"    public String getSomePublic() {\n" + 
			"        return \"SomePublic\";\n" + 
			"    }\n" + 
			"}\n"
		};
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		runNegativeTest(testFiles,
			"----------\n" + 
			"1. ERROR in X.java (at line 21)\n" + 
			"	* @return\n" + 
			"	   ^^^^^^\n" + 
			"Javadoc: Missing return type description\n" + 
			"----------\n"
		);
	}

	/**
	 * @bug 166436: [javadoc] Potentially wrong javadoc warning for unexpected duplicate tag value
	 * @test Ensure that no duplicate warning is raised for value tag
	 * @see "http://bugs.eclipse.org/bugs/show_bug.cgi?id=166436"
	 */
	public void testBug166436() {
		String[] testFiles = new String[] {
			"X.java",
			"public class X {\n" + 
			"	public static final String PUBLIC_CONST = \"public\";\n" + 
			"	protected static final String PROTECTED_CONST = \"protected\";\n" + 
			"	static final String DEFAULT_CONST = \"default\"; \n" + 
			"	private static final String PRIVATE_CONST = \"private\"; \n" + 
			"	/**\n" + 
			"	 * Values:\n" + 
			"	 * <ul>\n" + 
			"	 * 	<li>{@value #PUBLIC_CONST}</li>\n" + 
			"	 * 	<li>{@value #PROTECTED_CONST}</li>\n" + 
			"	 * 	<li>{@value #DEFAULT_CONST}</li>\n" + 
			"	 * 	<li>{@value #PRIVATE_CONST}</li>\n" + 
			"	 * </ul>\n" + 
			"	 */\n" + 
			"	public X() {\n" + 
			"	}\n" + 
			"}\n"
		};
		this.reportInvalidJavadocVisibility = CompilerOptions.PUBLIC;
		if (complianceLevel.equals(COMPLIANCE_1_3) || complianceLevel.equals(COMPLIANCE_1_4)) {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 9)\n" + 
				"	* 	<li>{@value #PUBLIC_CONST}</li>\n" + 
				"	  	      ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 10)\n" + 
				"	* 	<li>{@value #PROTECTED_CONST}</li>\n" + 
				"	  	      ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 11)\n" + 
				"	* 	<li>{@value #DEFAULT_CONST}</li>\n" + 
				"	  	      ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 12)\n" + 
				"	* 	<li>{@value #PRIVATE_CONST}</li>\n" + 
				"	  	      ^^^^^\n" + 
				"Javadoc: Unexpected tag\n" + 
				"----------\n"
			);
		} else {
			runNegativeTest(testFiles,
				"----------\n" + 
				"1. ERROR in X.java (at line 10)\n" + 
				"	* 	<li>{@value #PROTECTED_CONST}</li>\n" + 
				"	  	            ^^^^^^^^^^^^^^^^\n" + 
				"Javadoc: \'public\' visibility for malformed doc comments hides this \'protected\' reference\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 11)\n" + 
				"	* 	<li>{@value #DEFAULT_CONST}</li>\n" + 
				"	  	            ^^^^^^^^^^^^^^\n" + 
				"Javadoc: \'public\' visibility for malformed doc comments hides this \'default\' reference\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 12)\n" + 
				"	* 	<li>{@value #PRIVATE_CONST}</li>\n" + 
				"	  	            ^^^^^^^^^^^^^^\n" + 
				"Javadoc: \'public\' visibility for malformed doc comments hides this \'private\' reference\n" + 
				"----------\n"
			);
		}
	}
}
