/*******************************************************************************
 * Copyright (c) 2011, 2012 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.debug.tests.performance;

import java.util.ArrayList;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.internal.core.BreakpointManager;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.debug.tests.AbstractDebugPerformanceTest;
import org.eclipse.test.performance.Dimension;
import org.eclipse.ui.IEditorPart;

/**
 * Tests the performance of various parts of the {@link BreakpointManager}
 *
 * @since 3.8
 */
public class BreakpointManagerPerfTests extends AbstractDebugPerformanceTest {

	/**
	 * Constructor
	 * @param name
	 */
	public BreakpointManagerPerfTests() {
		super("Breakpoint Manager Performance");
	}

	static IBreakpoint[] NO_BREAKPOINTS = new IBreakpoint[0];
	static String fgTypeName = "BPManagerPerf";

	/**
	 * Create the given number of breakpoints in the given resource starting from the given line
	 *
	 * @param count
	 * @throws Exception
	 * @return the collection of breakpoints
	 */
	IBreakpoint[] generateBreakpoints(int count) throws Exception {
		IType type = getType(fgTypeName);
		assertNotNull("the type "+fgTypeName+" should exist", type);
		assertTrue("The type "+fgTypeName+" must be a file", type.getResource().getType() == IResource.FILE);
		IEditorPart editor = openEditor((IFile)type.getResource());
		assertNotNull("the editor for "+fgTypeName+" should have been created", editor);
		ArrayList<IBreakpoint> bps = new ArrayList<IBreakpoint>(count);
		IBreakpoint bp = createClassPrepareBreakpoint(type);
		if(bp != null) {
			bps.add(bp);
		}
		bp = createMethodBreakpoint(fgTypeName, "main", Signature.createMethodSignature(new String[] {"[Ljava.lang.String;"}, Signature.SIG_VOID), true, true);
		if(bp != null) {
			bps.add(bp);
		}
		int end = 9+count;
		for(int i = 11; i < end; i++) {
			bp = createLineBreakpoint(i, fgTypeName);
			if(bp != null) {
				bps.add(bp);
			}
		}
		assertEquals("the should have been "+count+" breakpoints created", count, bps.size());
		return bps.toArray(new IBreakpoint[bps.size()]);
	}

	/**
	 * Tests the time required to start the {@link BreakpointManager}
	 * @throws Exception
	 */
	public void testStartup200Breakpoints() throws Exception {
		tagAsSummary("Start Breakpoint Manager - 200 BPs", Dimension.ELAPSED_PROCESS);
		try {
			IBreakpoint[] bps = generateBreakpoints(200);
			assertTrue("There should be 200 breakpoints", bps.length == 200);
			BreakpointManager mgr = (BreakpointManager) getBreakpointManager();
			//clean it up before starting
			mgr.shutdown();
			for(int i = 0; i < 6500; i++) {
				try {
					startMeasuring();
					mgr.ensureInitialized();
					stopMeasuring();
				}
				finally {
					mgr.shutdown();
				}
			}
			commitMeasurements();
			assertPerformance();
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the time required to start the {@link BreakpointManager}
	 * @throws Exception
	 */
	public void testStartup50Breakpoints() throws Exception {
		tagAsSummary("Start Breakpoint Manager - 50 BPs", Dimension.ELAPSED_PROCESS);
		try {
			IBreakpoint[] bps = generateBreakpoints(50);
			assertTrue("There should be 50 breakpoints", bps.length == 50);
			BreakpointManager mgr = (BreakpointManager) getBreakpointManager();
			//clean it up before starting
			mgr.shutdown();
			for(int i = 0; i < 6500; i++) {
				try {
					startMeasuring();
					mgr.ensureInitialized();
					stopMeasuring();
				}
				finally {
					mgr.shutdown();
				}
			}
			commitMeasurements();
			assertPerformance();
		}
		finally {
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests the time required to start the {@link BreakpointManager}
	 * @throws Exception
	 */
	public void testStartup100Breakpoints() throws Exception {
		tagAsSummary("Start Breakpoint Manager - 100 BPs", Dimension.ELAPSED_PROCESS);
		try {
			IBreakpoint[] bps = generateBreakpoints(100);
			assertTrue("There should be 100 breakpoints", bps.length == 100);
			BreakpointManager mgr = (BreakpointManager) getBreakpointManager();
			//clean it up before starting
			mgr.shutdown();
			for(int i = 0; i < 6500; i++) {
				try {
					startMeasuring();
					mgr.ensureInitialized();
					stopMeasuring();
				}
				finally {
					mgr.shutdown();
				}
			}
			commitMeasurements();
			assertPerformance();
		}
		finally {
			removeAllBreakpoints();
		}
	}
}
