/*******************************************************************************
 * Copyright (c) 2000, 2018 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.ui.tests.performance.views;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import junit.extensions.TestSetup;
import junit.framework.Test;

import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.jdt.testplugin.JavaTestPlugin;
import org.eclipse.test.OrderedTestSuite;
import org.eclipse.test.performance.Performance;
import org.eclipse.test.performance.PerformanceMeter;

import org.eclipse.core.runtime.NullProgressMonitor;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
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.CompilationUnit;
import org.eclipse.jdt.core.manipulation.OrganizeImportsOperation;
import org.eclipse.jdt.core.manipulation.SharedASTProviderCore;

import org.eclipse.jdt.ui.tests.performance.JdtPerformanceTestCase;

public class OrganizeImportsPerfTest extends JdtPerformanceTestCase {

	private static class MyTestSetup extends TestSetup {
		public static final String SRC_CONTAINER= "src";

		public static IJavaProject fJProject1;

		public MyTestSetup(Test test) {
			super(test);
		}

		@Override
		protected void setUp() throws Exception {
			fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
			assertTrue("rt not found", JavaProjectHelper.addRTJar(fJProject1) != null);
			File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC_381);
			JavaProjectHelper.addSourceContainerWithImport(fJProject1, SRC_CONTAINER, junitSrcArchive, JavaProjectHelper.JUNIT_SRC_ENCODING);
		}

		@Override
		protected void tearDown() throws Exception {
			if (fJProject1 != null && fJProject1.exists())
				JavaProjectHelper.delete(fJProject1);
		}
	}

	public static Test suite() {
		return new MyTestSetup(new OrderedTestSuite(OrganizeImportsPerfTest.class, new String[] {
			"testOrganizeImport"
		}));
	}

	public static Test setUpTest(Test someTest) {
		return new MyTestSetup(someTest);
	}

	private void addAllCUs(IJavaElement[] children, List<IJavaElement> result) throws JavaModelException {
		for (int i= 0; i < children.length; i++) {
			IJavaElement element= children[i];
			if (element instanceof ICompilationUnit) {
				result.add(element);
			} else if (element instanceof IPackageFragmentRoot) {
				IPackageFragmentRoot root= ((IPackageFragmentRoot)element);
				addAllCUs(root.getChildren(), result);
			} else if (element instanceof IPackageFragment) {
				IPackageFragment pack= ((IPackageFragment)element);
				addAllCUs(pack.getChildren(), result);
			}
		}
	}

	private CompilationUnit[] createASTs(ICompilationUnit[] cus) {
		CompilationUnit[] result= new CompilationUnit[cus.length];
		for (int i= 0; i < cus.length; i++) {
			result[i]= SharedASTProviderCore.getAST(cus[i], SharedASTProviderCore.WAIT_YES, new NullProgressMonitor());
		}
		return result;
	}

	public void testOrganizeImport() throws Exception {
		measure(Performance.getDefault().getNullPerformanceMeter(), 10);
		measure(fPerformanceMeter, 10);
		
		// test is too short and hence the relative numbers spread too far (but still in an acceptable absolute band) 
//		tagAsSummary("Organize Imports", Dimension.ELAPSED_PROCESS);
		
		commitMeasurements();
		Performance.getDefault().assertPerformance(fPerformanceMeter);
	}

	private void measure(PerformanceMeter performanceMeter, int runs) throws Exception {
		for (int j= 0; j < runs; j++) {
			List<IJavaElement> cusList= new ArrayList<>();
			addAllCUs(MyTestSetup.fJProject1.getChildren(), cusList);
			ICompilationUnit[] cus= cusList.toArray(new ICompilationUnit[cusList.size()]);
			CompilationUnit[] roots= createASTs(cus);

			joinBackgroudActivities();
			
			performanceMeter.start();
			for (int i= 0; i < roots.length; i++) {
				OrganizeImportsOperation op= new OrganizeImportsOperation(cus[i], roots[i], true, true, true, null);
				op.run(new NullProgressMonitor());
			}
			performanceMeter.stop();
		}
		
	}

}
