/*******************************************************************************
 * Copyright (c) 2000, 2013 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.jdt.core.tests.model;

import junit.framework.Test;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IAnnotation;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.ILocalVariable;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageDeclaration;
import org.eclipse.jdt.core.ISourceReference;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeParameter;
import org.eclipse.jdt.core.JavaModelException;

public class GetSourceTests extends ModifyingResourceTests {

	ICompilationUnit cu;

	// Use this static initializer to specify subset for tests
	// All specified tests which do not belong to the class are skipped...
	static {
		// Names of tests to run: can be "testBugXXXX" or "BugXXXX")
//		TESTS_NAMES = new String[] { "TypeParameterBug73884" };
		// Numbers of tests to run: "test<number>" will be run for each number of this array
//		TESTS_NUMBERS = new int[] { 13 };
		// Range numbers of tests to run: all tests between "test<first>" and "test<last>" will be run for { first, last }
//		TESTS_RANGE = new int[] { 16, -1 };
	}

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

	public static Test suite() {
		return buildModelTestSuite(GetSourceTests.class);
	}
	/**
	 * Test the field constant
	 */
	private IField getConstantField(String fieldName) {
		IType type = getCompilationUnit("/P/p/Constants.java").getType("Constants");
		IField field = type.getField(fieldName);
		return field;
	}

	public void setUpSuite() throws Exception {
		super.setUpSuite();
		createJavaProject("P");
		createFolder("/P/p");
		createFile(
			"/P/p/X.java",
			"package p;\n" +
			"import java.lang.*;\n" +
			"public class X {\n" +
			"  public Object field;\n" +
			"  private int s\\u0069ze;\n" +
			"  void foo(String s) {\n" +
			"    final int var1 = 2;\n" +
			"    Object var2;\n" +
			"    for (int i = 0;  i < 10; i++) {}\n" +
			"  }\n" +
			"  private int bar() {\n" +
			"    return 1;\n" +
			"  }\n" +
			"  /**\n" +
			"   * Returns the size.\n" +
			"   * @return\n" +
			"   *     the size\n" +
			"   */\n" +
			"  int getSiz\\u0065 () {\n" +
			"    return this.size;\n" +
			"  }\n" +
			"}"
		);
		this.cu = getCompilationUnit("/P/p/X.java");
		String cuSource =
			"package p;\n" +
			"public class Constants {\n" +
			"  static final long field1 = 938245798324893L;\n" +
			"  static final long field2 = 938245798324893l;\n" +
			"  static final long field3 = 938245798324893;\n" +
			"  static final char field4 = ' ';\n" +
			"  static final double field5 = 938245798324893D;\n" +
			"  static final float field6 = 123456f;\n" +
			"  static final String field7 = \"simple string\";\n" +
			"  static final java.lang.String field8 = \"qualified string\";\n" +
			"  static final int field9 = 1<<0;\n" +
			"}";
		createFile("/P/p/Constants.java", cuSource);
	}

	public void tearDownSuite() throws Exception {
		deleteProject("P");
		super.tearDownSuite();
	}

	/**
	 * Ensure the source for a field contains the modifiers, field
	 * type, name, and terminator.
	 */
	public void testField() throws JavaModelException {
		IType type = this.cu.getType("X");
		IField field = type.getField("field");

		String actualSource = field.getSource();
		String expectedSource = "public Object field;";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	public void testFieldConstant01() throws CoreException {
		IField field = getConstantField("field1");

		Object constant = field.getConstant();
		Long value = (Long) constant;
		assertEquals("Wrong value", 938245798324893l, value.longValue());
	}

	public void testFieldConstant02() throws CoreException {
		IField field = getConstantField("field2");

		Object constant = field.getConstant();
		Long value = (Long) constant;
		assertEquals("Wrong value", 938245798324893l, value.longValue());
	}

	public void testFieldConstant03() throws CoreException {
		IField field = getConstantField("field3");

		Object constant = field.getConstant();
		Long value = (Long) constant;
		assertEquals("Wrong value", 938245798324893l, value.longValue());
	}

	public void testFieldConstant04() throws CoreException {
		IField field = getConstantField("field4");

		Object constant = field.getConstant();
		Character character = (Character) constant;
		assertEquals("Wrong value", ' ', character.charValue());
	}

	public void testFieldConstant05() throws CoreException {
		IField field = getConstantField("field5");

		Object constant = field.getConstant();
		Double double1 = (Double) constant;
		assertEquals("Wrong value", 938245798324893l, double1.doubleValue(), 0.01);
	}

	public void testFieldConstant06() throws CoreException {
		IField field = getConstantField("field6");

		Object constant = field.getConstant();
		Float float1 = (Float) constant;
		assertEquals("Wrong value", 123456, float1.floatValue(), 0.01f);
	}

	public void testFieldConstant07() throws CoreException {
		IField field = getConstantField("field7");
		assertEquals("Wrong value", "\"simple string\"", field.getConstant());
	}

	public void testFieldConstant08() throws CoreException {
		IField field = getConstantField("field8");
		assertEquals("Wrong value", "\"qualified string\"", field.getConstant());
	}

	public void testFieldConstant09() throws CoreException {
		IField field = getConstantField("field9");

		Object constant = field.getConstant();
		assertNull("Should not be a constant", constant);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=406836
	public void testFieldConstants406836() throws CoreException {
		try {
			String cuSource =
					"package p;\n" +
					"public class A{\n" +
					"    final long CONST = 1;\n" +
					"    final long NON_TRIVIAL_INITIALIZER_NON_CONST = 2<<8;\n" +
					"    static long STATIC_NOT_CONST = 3;\n" +
					"    final int NON_COMPILE_TIME_CONSTANT = new Integer(4).intValue();\n" +
					"}\n" +
					"interface B{\n" +
					"	final long CONST = 1;\n" +
					"	final long NON_TRIVIAL_INITIALIZER_NON_CONST = 2<<8;\n" +
					"	static long STATIC_NOT_CONST = 3;\n" +
					"	final int NON_COMPILE_TIME_CONSTANT = new Integer(4).intValue();\n" +
					"}\n";
			createFile("/P/p/A.java", cuSource);
			IType type = getCompilationUnit("/P/p/A.java").getType("A");

			Object constant = type.getField("CONST").getConstant();
			Long value = (Long) constant;
			assertEquals("Wrong value", 1, value.intValue());

			constant = type.getField("NON_TRIVIAL_INITIALIZER_NON_CONST").getConstant();
			assertNull("Should not be a constant", constant);

			constant = type.getField("STATIC_NOT_CONST").getConstant();
			assertNull("Should not be a constant", constant);

			constant = type.getField("NON_COMPILE_TIME_CONSTANT").getConstant();
			assertNull("Should not be a constant", constant);

			type = getCompilationUnit("/P/p/A.java").getType("B");

			constant = type.getField("CONST").getConstant();
			value = (Long) constant;
			assertEquals("Wrong value", 1, value.intValue());

			constant = type.getField("NON_TRIVIAL_INITIALIZER_NON_CONST").getConstant();
			assertNull("Should not be a constant", constant);

			constant = type.getField("STATIC_NOT_CONST").getConstant();
			value = (Long) constant;
			assertEquals("Wrong value", 3, value.intValue());

			constant = type.getField("NON_COMPILE_TIME_CONSTANT").getConstant();
			assertNull("Should not be a constant", constant);
		} finally {
			deleteFile("/P/p/A.java");
		}
	}

	/*
	 * Ensures that the Javadoc range for a method is correct.
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=232944 )
	 */
	public void testJavadocRange01() throws CoreException {
		try {
			String cuSource =
				"package p;\n" +
				"class A{\n" +
				"    /**\n" +
				"     * swsw\n" +
				"     */\n" +
				"    void m(){\n" +
				"    }\n" +
				"}";
			createFile("/P/p/A.java", cuSource);
			IMethod method = getCompilationUnit("/P/p/A.java").getType("A").getMethod("m", new String[0]);
			assertSourceEquals(
				"Unexpected Javadoc'",
				"/**\n" +
				"     * swsw\n" +
				"     */",
				getSource(cuSource, method.getJavadocRange()));
		} finally {
			deleteFile("/P/p/A.java");
		}
	}

	/*
	 * Ensures that the Javadoc range for a class is correct.
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=232944 )
	 */
	public void testJavadocRange02() throws CoreException {
		try {
			String cuSource =
				"package p;\n" +
				"/** X */class A {}";
			createFile("/P/p/A.java", cuSource);
			IType type = getCompilationUnit("/P/p/A.java").getType("A");
			assertSourceEquals(
				"Unexpected Javadoc'",
				"/** X */",
				getSource(cuSource, type.getJavadocRange()));
		} finally {
			deleteFile("/P/p/A.java");
		}
	}

	/**
	 * Ensure the source for an import contains the 'import' keyword,
	 * name, and terminator.
	 */
	public void testImport() throws JavaModelException {
		IImportDeclaration i = this.cu.getImport("java.lang.*");

		String actualSource = i.getSource();
		String expectedSource = "import java.lang.*;";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/*
	 * Ensures the source for a local variable contains the modifiers, type and name.
	 */
	public void testLocalVariable1() throws JavaModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.java", "var1 = 2;", "var1");

		String actualSource = ((ISourceReference)var).getSource();
		String expectedSource = "final int var1 = 2;";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/*
	 * Ensures the source for a local variable contains the modifiers, type and name.
	 */
	public void testLocalVariable2() throws JavaModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.java", "var2;", "var2");

		String actualSource = ((ISourceReference)var).getSource();
		String expectedSource = "Object var2;";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/*
	 * Ensures the source for a local variable contains the modifiers, type and name.
	 */
	public void testLocalVariable3() throws JavaModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.java", "i = 0;", "i");

		String actualSource = ((ISourceReference)var).getSource();
		String expectedSource = "int i = 0"; // semi-colon is not part of the local declaration in a for statement
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/*
	 * Ensures the source for a local variable contains the modifiers, type and name.
	 */
	public void testLocalVariable4() throws JavaModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.java", "s) {", "s");

		String actualSource = ((ISourceReference)var).getSource();
		String expectedSource = "String s";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/**
	 * Ensure the source for a method contains the modifiers, return
	 * type, selector, and terminator.
	 */
	public void testMethod() throws JavaModelException {
		IType type = this.cu.getType("X");
		IMethod method= type.getMethod("bar", new String[0]);

		String actualSource = method.getSource();
		String expectedSource =
			"private int bar() {\n" +
			"    return 1;\n" +
			"  }";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/*
	 * Ensures that the name range for an annotation is correct.
	 */
	public void testNameRange01() throws CoreException { // was testAnnotationNameRange1
		try {
			String cuSource =
				"package p;\n" +
				"@ MyAnnot (1)\n" +
				"public class Y {\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IAnnotation annotation = getCompilationUnit("/P/p/Y.java").getType("Y").getAnnotation("MyAnnot");
			assertSourceEquals(
				"Unexpected source'",
				"MyAnnot",
				getNameSource(cuSource, annotation));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures that the name range for an annotation is correct.
	 */
	public void testNameRange02() throws CoreException { // was testAnnotationNameRange2
		try {
			String cuSource =
				"package p;\n" +
				"@x.  y  .  z.MyAnnot (1)\n" +
				"public class Y {\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IAnnotation annotation = getCompilationUnit("/P/p/Y.java").getType("Y").getAnnotation("x.y.z.MyAnnot");
			assertSourceEquals(
				"Unexpected source'",
				"x.  y  .  z.MyAnnot",
				getNameSource(cuSource, annotation));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures that the name range for an annotation on a local variable is correct.
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=209823)
	 */
	public void testNameRange03() throws CoreException { // was testAnnotationNameRange3
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  void foo() {\n" +
				"    @MyAnnot int local;\n" +
				"  }\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IAnnotation annotation = getLocalVariable(getCompilationUnit("/P/p/Y.java"), "local", "local").getAnnotation("MyAnnot");
			assertSourceEquals(
				"Unexpected source'",
				"MyAnnot",
				getNameSource(cuSource, annotation));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the name range for an anonymous class is correct.
	 * (regression test for bug 44450 Strange name range for anonymous classes)
	 */
	public void testNameRange04() throws CoreException { // was testNameRangeAnonymous
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  void foo() {\n" +
				"    Y y = new Y() {};\n" +
				"    class C {\n" +
				"    }\n"+
				"  }\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IType anonymous = getCompilationUnit("/P/p/Y.java").getType("Y").getMethod("foo", new String[0]).getType("", 1);

			String actualSource = getNameSource(cuSource, anonymous);
			String expectedSource = "Y";
			assertSourceEquals("Unexpected source'", expectedSource, actualSource);
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the name range for a type parameter is correct.
	 */
	public void testNameRange05() throws CoreException { // was testNameRangeTypeParameter1
		try {
			String cuSource =
				"package p;\n" +
				"public class Y<T extends String> {\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			ITypeParameter typeParameter = getCompilationUnit("/P/p/Y.java").getType("Y").getTypeParameter("T");
			assertSourceEquals(
				"Unexpected source'",
				"T",
				getNameSource(cuSource, typeParameter));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the name range for a type parameter is correct.
	 */
	public void testNameRange06() throws CoreException { // was testNameRangeTypeParameter2
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  <T extends String, U extends StringBuffer & Runnable> void foo() {} \n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			ITypeParameter typeParameter = getCompilationUnit("/P/p/Y.java").getType("Y").getMethod("foo", new String[0]).getTypeParameter("U");
			assertSourceEquals(
				"Unexpected source'",
				"U",
				getNameSource(cuSource, typeParameter));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the name range for a method with syntax errors in its header is correct.
	 * (regression test for bug 43139 Delete member in Outliner not working)
	 */
	public void testNameRange07() throws CoreException { // was testNameRangeMethodWithSyntaxError
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  void foo() {\n" +
				"  }\n" +
				"  void static bar() {}\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IMethod method= getCompilationUnit("/P/p/Y.java").getType("Y").getMethod("bar", new String[0]);

			String actualSource = getNameSource(cuSource, method);
			String expectedSource = "bar";
			assertSourceEquals("Unexpected source'", expectedSource, actualSource);
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the name range for an anonymous enum constant is correct
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=226313 )
	 */
	public void testNameRange08() throws CoreException {
		try {
			createJavaProject("P15", new String[] {""}, new String[0], "", "1.5");
			String cuSource =
				"public enum X {\n" +
				"  GREEN() {\n" +
				"  };\n" +
				"}";
			createFile("/P15/X.java", cuSource);
			IType type = getCompilationUnit("/P15/X.java").getType("X").getField("GREEN").getType("", 1);
			assertSourceEquals(
				"Unexpected source'",
				"GREEN",
				getNameSource(cuSource, type));
		} finally {
			deleteProject("P15");
		}
	}

	/*
	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=150980
	 */
	public void testNameRange09() throws CoreException { // was testNameRangeAnonymous
		try {
			String cuSource =
				"package p . q . r. s ;\n" +
				"public class Y {\n" +
				"  void foo() {\n" +
				"    Y y = new Y() {};\n" +
				"    class C {\n" +
				"    }\n"+
				"  }\n" +
				"}";
			createFolder("/P/p/q/r/s/");
			createFile("/P/p/q/r/s/Y.java", cuSource);
			final IPackageDeclaration[] packageDeclarations = getCompilationUnit("/P/p/q/r/s/Y.java").getPackageDeclarations();
			assertEquals("Wrong size", 1, packageDeclarations.length);

			String actualSource = getNameSource(cuSource, packageDeclarations[0]);
			String expectedSource = "p . q . r. s";
			assertSourceEquals("Unexpected source'", expectedSource, actualSource);
		} finally {
			deleteFile("/P/p/q/r/s/Y.java");
		}
	}

	/*
	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=150980
	 */
	public void testNameRange10() throws CoreException { // was testNameRangeAnonymous
		try {
			String cuSource =
				"import java . lang . * ;\n" +
				"public class Y {\n" +
				"}";
			createFile("/P/Y.java", cuSource);
			final IImportDeclaration[] imports = getCompilationUnit("/P/Y.java").getImports();
			assertEquals("Wrong size", 1, imports.length);

			String actualSource = getNameSource(cuSource, imports[0]);
			String expectedSource = "java . lang . *";
			assertSourceEquals("Unexpected source'", expectedSource, actualSource);
		} finally {
			deleteFile("/P/Y.java");
		}
	}

	/*
	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=150980
	 */
	public void testNameRange11() throws CoreException { // was testNameRangeAnonymous
		try {
			String cuSource =
				"import java . lang  .  Object  ;\n" +
				"public class Y {\n" +
				"}";
			createFile("/P/Y.java", cuSource);
			final IImportDeclaration[] imports = getCompilationUnit("/P/Y.java").getImports();
			assertEquals("Wrong size", 1, imports.length);

			String actualSource = getNameSource(cuSource, imports[0]);
			String expectedSource = "java . lang  .  Object";
			assertSourceEquals("Unexpected source'", expectedSource, actualSource);
		} finally {
			deleteFile("/P/Y.java");
		}
	}

	/*
	 * Ensures that the source range for an annotation on a local variable is correct.
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=209823)
	 */
	public void testSourceRange01() throws CoreException { // was testAnnotationSourceRange
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  void foo() {\n" +
				"    @MyAnnot int local;\n" +
				"  }\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IAnnotation annotation = getLocalVariable(getCompilationUnit("/P/p/Y.java"), "local", "local").getAnnotation("MyAnnot");
			assertSourceEquals(
				"Unexpected source'",
				"@MyAnnot",
				getSource(cuSource, annotation.getSourceRange()));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures that the source range for an anonymous type is correct.
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=207775)
	 */
	public void testSourceRange02() throws CoreException { // was testAnonymousSourceRange
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  void foo() {\n" +
				"    new Object() {};\n" +
				"  }\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			IType type = getCompilationUnit("/P/p/Y.java").getType("Y").getMethod("foo", new String[0]).getType("", 1);
			assertSourceEquals(
				"Unexpected source'",
				"new Object() {}",
				getSource(cuSource, type.getSourceRange()));
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the source range for an anonymous enum constant is correct
	 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=226313 )
	 */
	public void testSourceRange03() throws CoreException {
		try {
			createJavaProject("P15", new String[] {""}, new String[0], "", "1.5");
			String cuSource =
				"public enum X {\n" +
				"  GREEN() {};\n" +
				"}";
			createFile("/P15/X.java", cuSource);
			IType type = getCompilationUnit("/P15/X.java").getType("X").getField("GREEN").getType("", 1);
			assertSourceEquals(
				"Unexpected source'",
				"GREEN() {}",
				getSource(cuSource, type.getSourceRange()));
		} finally {
			deleteProject("P15");
		}
	}

	/*
	 * Ensures the source for a type parameter is correct.
	 */
	public void testTypeParameter1() throws CoreException {
		try {
			String cuSource =
				"package p;\n" +
				"public class Y<T extends String> {\n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			ITypeParameter typeParameter = getCompilationUnit("/P/p/Y.java").getType("Y").getTypeParameter("T");
			assertSourceEquals(
				"Unexpected source'",
				"T extends String",
				typeParameter.getSource());
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/*
	 * Ensures the source for a type parameter is correct.
	 */
	public void testTypeParameter2() throws CoreException {
		try {
			String cuSource =
				"package p;\n" +
				"public class Y {\n" +
				"  <T extends String, U extends StringBuffer & Runnable> void foo() {} \n" +
				"}";
			createFile("/P/p/Y.java", cuSource);
			ITypeParameter typeParameter = getCompilationUnit("/P/p/Y.java").getType("Y").getMethod("foo", new String[0]).getTypeParameter("U");
			assertSourceEquals(
				"Unexpected source'",
				"U extends StringBuffer & Runnable",
				typeParameter.getSource());
		} finally {
			deleteFile("/P/p/Y.java");
		}
	}

	/**
	 * Ensure the source for a field contains the modifiers, field
	 * type, name, and terminator, and unicode characters.
	 */
	public void testUnicodeField() throws JavaModelException {
		IType type = this.cu.getType("X");
		IField field = type.getField("size");

		String actualSource = field.getSource();
		String expectedSource = "private int s\\u0069ze;";
		assertSourceEquals("Unexpected source'", expectedSource, actualSource);
	}

	/**
	 * Ensure the source for a field contains the modifiers, field
	 * type, name, and terminator, and unicode characters.
	 */
	public void testUnicodeMethod() throws JavaModelException {
		IType type = this.cu.getType("X");
		IMethod method= type.getMethod("getSize", null);

		String actualSource = method.getSource();
		String expectedSource =
			"/**\n" +
			"   * Returns the size.\n" +
			"   * @return\n" +
			"   *     the size\n" +
			"   */\n" +
			"  int getSiz\\u0065 () {\n" +
			"    return this.size;\n" +
			"  }";
		assertSourceEquals("Unexpected source", expectedSource, actualSource);
	}
}
