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

import org.eclipse.core.runtime.CoreException;
import org.eclipse.wst.jsdt.core.*;

import junit.framework.Test;

public class GetSourceTests extends ModifyingResourceTests {

	IJavaScriptUnit cu;

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

	public void setUpSuite() throws Exception {
		super.setUpSuite();
		createJavaProject("P");
		createFolder("/P/p");
		createFile("/P/p/X.js", "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.js");
		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 int field7 = 1<<0;\n" + "}";
		createFile("/P/p/Constants.js", cuSource);
	}

	// 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 static Test suite() {
		return buildModelTestSuite(GetSourceTests.class);
	}

	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 JavaScriptModelException {
		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);
	}

	/**
	 * Ensure the source for an import contains the 'import' keyword, name, and
	 * terminator.
	 */
	public void testImport() throws JavaScriptModelException {
		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 JavaScriptModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.js", "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 JavaScriptModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.js", "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 JavaScriptModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.js", "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 JavaScriptModelException {
		ILocalVariable var = getLocalVariable("/P/p/X.js", "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 JavaScriptModelException {
		IType type = this.cu.getType("X");
		IFunction method = type.getFunction("bar", new String[0]);

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

	/*
	 * 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 testNameRangeMethodWithSyntaxError() throws CoreException {
		try {
			String cuSource = "package p;\n" + "public class Y {\n"
					+ "  void foo() {\n" + "  }\n" + "  void static bar() {}\n"
					+ "}";
			createFile("/P/p/Y.js", cuSource);
			IFunction method = getCompilationUnit("/P/p/Y.js").getType("Y")
					.getFunction("bar", new String[0]);

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

	/*
	 * Ensures the name range for an anonymous class is correct. (regression
	 * test for bug 44450 Strange name range for anonymous classes)
	 */
	public void testNameRangeAnonymous() throws CoreException {
		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.js", cuSource);
			IType anonymous = getCompilationUnit("/P/p/Y.js").getType("Y")
					.getFunction("foo", new String[0]).getType("", 1);

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

	/**
	 * Ensure the source for a field contains the modifiers, field type, name,
	 * and terminator, and unicode characters.
	 */
	public void testUnicodeField() throws JavaScriptModelException {
		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 JavaScriptModelException {
		IType type = this.cu.getType("X");
		IFunction method = type.getFunction("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);
	}

	/**
	 * Test the field constant
	 */
	private IField getConstantField(String fieldName) {
		IType type = getCompilationUnit("/P/p/Constants.js").getType(
				"Constants");
		IField field = type.getField(fieldName);
		return field;
	}
}
