/*******************************************************************************
 * Copyright (c) 2021 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.text.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import org.eclipse.jdt.testplugin.JavaProjectHelper;

import org.eclipse.jface.text.Region;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;

import org.eclipse.jdt.internal.core.manipulation.search.IOccurrencesFinder.OccurrenceLocation;
import org.eclipse.jdt.internal.corext.dom.IASTSharedValues;

import org.eclipse.jdt.ui.tests.core.rules.Java1d8ProjectTestSetup;

import org.eclipse.jdt.internal.ui.javaeditor.JavaElementHyperlinkDetector;

/**
 * Tests for the BreakContinueTargerFinder class.
 *
 * @since 3.22
 */
public class EnumConstructorTargetFinderTest {
	@Rule
	public Java1d8ProjectTestSetup f18p= new Java1d8ProjectTestSetup();

	private ASTParser fASTParser;

	private IJavaProject fJavaProject;

	private IPackageFragmentRoot fSourceFolder;

	@Before
	public void setUp() throws Exception {
		fASTParser= ASTParser.newParser(IASTSharedValues.SHARED_AST_LEVEL);
		fJavaProject= f18p.getProject();
		fSourceFolder= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
	}

	@After
	public void tearDown() throws Exception {
		JavaProjectHelper.clear(fJavaProject, f18p.getDefaultClasspath());
	}

	private CompilationUnit createCompilationUnit(String source) throws JavaModelException {
		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
		ICompilationUnit cu= pack1.createCompilationUnit("E.java", source, true, null);
		fASTParser.setSource(cu);
		fASTParser.setResolveBindings(true);
		return (CompilationUnit) fASTParser.createAST(null);
	}

	private OccurrenceLocation getTarget(CompilationUnit root, int offset, int length) throws Exception {
		return JavaElementHyperlinkDetector.findEnumConstructorTarget(root.getTypeRoot(), new Region(offset, length));
	}

	private void checkSelection(CompilationUnit root, int offset, int length, OccurrenceLocation expected) throws Exception {
		OccurrenceLocation selectedNode= getTarget(root, offset, length);
		assertNotNull("Selection null", selectedNode);
		assertEquals("Offset\n" + expected.getDescription(), expected.getOffset(), selectedNode.getOffset());
		assertEquals("Length\n" + expected.getDescription(), expected.getLength(), selectedNode.getLength());
	}

	@Test
	public void testEnumConstructorFinder_1() throws Exception {
		String s= "" +
				"package test1;\n" +
				"class E {\n" +

				"   public enum A {\n" +
				"      A1,\n" +
				"      A2;\n" +
				"   }\n" +

				"}\n";

		CompilationUnit root= createCompilationUnit(s);

		{
			int offset= s.indexOf("A1,");
			int targetOffset= s.indexOf("A1,");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 2 /* 'A1' */, 0, "A1"));
		}
	}

	@Test
	public void testEnumConstructorFinder_2() throws Exception {
		String s= "" +
				"package test1;\n" +
				"class E {\n" +

				"   public enum A {\n" +
				"      A1(B.B1),\n" +
				"      A2(1, B.B2),\n" +
				"      A3(B.B2, 2);\n" +

				"      A(B b) {\n" +
				"      }\n" +
				"      A(B b, int i) {\n" +
				"      }\n" +
				"      A(int i, B b) {\n" +
				"      }\n" +
				"   }\n" +

				"   public enum B {\n" +
				"      B1,\n" +
				"      B2;\n" +
				"   }\n" +
				"}\n";

		CompilationUnit root= createCompilationUnit(s);

		{
			int offset= s.indexOf("A1(B.B1)");
			int targetOffset= s.indexOf("A(B b)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(B b)"));
		}
		{
			int offset= s.indexOf("A2(1, B.B2)");
			int targetOffset= s.indexOf("A(int i, B b)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(int i, B b)"));
		}
		{
			int offset= s.indexOf("A3(B.B2, 2)");
			int targetOffset= s.indexOf("A(B b, int i)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(B b, int i)"));
		}
	}

	@Test
	public void testEnumConstructorFinder_3() throws Exception {
		String s= "" +
				"package test1;\n" +
				"class E {\n" +

				"   public enum A {\n" +
				"      A1(1, 2),\n" +
				"      A2(1, 2.0),\n" +
				"      A3(2.0, 1);\n" +

				"      A(int i1, int i2) {\n" +
				"      }\n" +
				"      A(double d, int i) {\n" +
				"      }\n" +
				"      A(int i, double d) {\n" +
				"      }\n" +
				"   }\n" +
				"}\n";

		CompilationUnit root= createCompilationUnit(s);

		{
			int offset= s.indexOf("A1(1, 2)");
			int targetOffset= s.indexOf("A(int i1, int i2)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(int i1, int i2)"));
		}
		{
			int offset= s.indexOf("A2(1, 2.0)");
			int targetOffset= s.indexOf("A(int i, double d)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(int i, double d)"));
		}
		{
			int offset= s.indexOf("A3(2.0, 1)");
			int targetOffset= s.indexOf("A(double d, int i)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(double d, int i)"));
		}
	}

	@Test
	public void testEnumConstructorFinder_4() throws Exception {
		String s= "" +
				"package test1;\n" +
				"class E {\n" +

				"   public enum A {\n" +
				"      A1(B.B1),\n" +
				"      A2(B.B2, 1),\n" +
				"      A3(1, B.B2, 2),\n" +
				"      A4(B.B1, 3),\n" +
				"      A5(B.B1, Double.valueOf(5.0)),\n" +
				"      A6(\"string\");\n" +

				"      void foo(String s) {\n" +
				"      }\n" +
				"      A(B b) {\n" +
				"      }\n" +
				"      A(B b, int i) {\n" +
				"      }\n" +
				"      A(B b, Double d) {\n" +
				"      }\n" +
				"      A(int i1, B b, int i2) {\n" +
				"      }\n" +
				"      A(String s) {\n" +
				"      }\n" +
				"   }\n" +

				"   public enum B {\n" +
				"      B1,\n" +
				"      B2;\n" +
				"   }\n" +
				"}\n";

		CompilationUnit root= createCompilationUnit(s);

		{
			int offset= s.indexOf("A1(B.B1)");
			int targetOffset= s.indexOf("A(B b)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(B b)"));
		}
		{
			int offset= s.indexOf("A2(B.B2, 1)");
			int targetOffset= s.indexOf("A(B b, int i)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(B b, int i)"));
		}
		{
			int offset= s.indexOf("A3(1, B.B2, 2)");
			int targetOffset= s.indexOf("A(int i1, B b, int i2)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(int i1, B b, int i2)"));
		}
		{
			int offset= s.indexOf("A4(B.B1, 3)");
			int targetOffset= s.indexOf("A(B b, int i)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(B b, int i)"));
		}
		{
			int offset= s.indexOf("A5(B.B1, Double.valueOf(5.0))");
			int targetOffset= s.indexOf("A(B b, Double d)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(B b, Double d)"));
		}
		{
			int offset= s.indexOf("A6(\"string\")");
			int targetOffset= s.indexOf("A(String s)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(String s)"));
		}
	}

	@Test
	public void testEnumConstructorFinder_5() throws Exception {
		String s= "" +
				"package test1;\n" +
				"class E {\n" +

				"   public enum A {\n" +
				"      A1(\"\"),\n" +
				"      A2(\"\",\"\");\n" +

				"      A(String ... strings) {\n" +
				"      }\n" +
				"      A(String s) {\n" +
				"      }\n" +
				"   }\n" +
				"}\n";

		CompilationUnit root= createCompilationUnit(s);

		{
			int offset= s.indexOf("A1(\"\")");
			int targetOffset= s.indexOf("A(String s)");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 1 /* 'A' */, 0, "A(String s)"));
		}
		{
			int offset= s.indexOf("A2(\"\",\"\")");
			int targetOffset= s.indexOf("A2(\"\",\"\")");
			checkSelection(root, offset, 0, new OccurrenceLocation(targetOffset, 2 /* 'A2' */, 0, "A2(\"\",\"\")"));
		}
	}
}
