/*******************************************************************************
 * Copyright (c) 2004, 2012 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *     Yatta Solutions -  WorkingSet tests (bug 334024)
 *******************************************************************************/

package org.eclipse.mylyn.java.tests;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.commons.sdk.util.UiTestUtil;
import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.core.IInteractionElement;
import org.eclipse.mylyn.context.sdk.java.AbstractJavaContextTest;
import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;

/**
 * @author Mik Kersten
 * @author Carsten Reckord (bug 334024: focused package explorer not working if top level element is working set)
 */
public class ResourceStructureMappingTest extends AbstractJavaContextTest {

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		// make sure some part is active
		UiTestUtil.openResourceNavigator();
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();

		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
		IWorkingSet workingSet = workingSetManager.getWorkingSet("TestWorkingSet");
		if (workingSet != null) {
			workingSetManager.removeWorkingSet(workingSet);
		}
	}

	public void testParentResourceMapping() throws CoreException {
		IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
		IMethod m1 = type1.createMethod("public void m1() { }", null, true, null);

		monitor.selectionChanged(part, new StructuredSelection(m1));
		IInteractionElement m1Node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
		assertTrue(m1Node.getInterest().isInteresting());

		IResource containingResource = ResourcesUiBridgePlugin.getDefault().getResourceForElement(m1Node, true);
		assertEquals(m1.getCompilationUnit().getAdapter(IResource.class), containingResource);
	}

	/**
	 * Test that working sets are correctly handled in the presence of the Java bridge
	 */
	public void testWorkingSetFiltering() throws CoreException {
		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
		IWorkingSet workingSet = workingSetManager.createWorkingSet("TestWorkingSet",
				new IAdaptable[] { project.getProject() });
		workingSet.setId("org.eclipse.jdt.ui.JavaWorkingSetPage");
		workingSetManager.addWorkingSet(workingSet);

		context.reset();
		assertEquals(0, context.getInteractionHistory().size());

		// make sure the correct bridge is used in the presence of the java bridge
		AbstractContextStructureBridge workingSetBridge = ContextCore.getStructureBridge(workingSet);
		assertEquals(ContextCore.CONTENT_TYPE_RESOURCE, workingSetBridge.getContentType());

		// without an interesting project, the working set should be filtered
		assertTrue(workingSetBridge.canFilter(workingSet));

		IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
		monitor.selectionChanged(part, new StructuredSelection(type1));
		IInteractionElement element = ContextCore.getContextManager().getElement(type1.getHandleIdentifier());
		assertTrue(element.getInterest().isInteresting());

		// with an interesting project, the working set should no longer be filtered
		assertFalse(workingSetBridge.canFilter(workingSet));

	}
}
