/******************************************************************************
 * Copyright (c) 2006, 2007 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.gmf.tests.runtime.diagram.ui.tools;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.gef.EditDomain;
import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool;
import org.eclipse.gmf.runtime.diagram.ui.type.DiagramNotationType;
import org.eclipse.gmf.tests.runtime.diagram.ui.AbstractTestBase;
import org.eclipse.gmf.tests.runtime.diagram.ui.util.PresentationTestFixture;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Event;

/**
 * Tests for Connection Tools.
 * 
 * @author cmahoney
 */
public class ConnectionToolTests
	extends AbstractTestBase {

	public static Test suite() {
		TestSuite s = new TestSuite(ConnectionToolTests.class);
		return s;
	}

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

	protected void setTestFixture() {
		testFixture = new PresentationTestFixture();
	}

	protected PresentationTestFixture getFixture() {
		return (PresentationTestFixture) testFixture;
	}

	/**
	 * Test selection of notes where there is currently no focus edit part.
	 */
	public void test_doubleClickUnspecifiedTypeConnectionTool()
		throws Exception {

		getFixture().openDiagram();

		List eps = new ArrayList(2);
		eps.add(getFixture().createNote());
		eps.add(getFixture().createNote());

		assertEquals("Notes not created properly.", //$NON-NLS-1$
			2, getDiagramEditPart().getPrimaryEditParts().size());
		assertEquals("There shouldn't be any connections yet.", //$NON-NLS-1$
			0, getDiagramEditPart().getConnections().size());

		getDiagramEditPart().getViewer().setSelection(
			new StructuredSelection(eps));

		UnspecifiedTypeConnectionTool tool = new UnspecifiedTypeConnectionTool(
			Collections.singletonList(DiagramNotationType.NOTE_ATTACHMENT));
		tool.setEditDomain((EditDomain) getDiagramWorkbenchPart()
			.getDiagramEditDomain());
		tool.activate();
		tool.mouseDoubleClick(createMouseEvent(0, 0), getDiagramEditPart()
			.getViewer());
		tool.deactivate();

		assertEquals("Connection wasn't created.", //$NON-NLS-1$
			1, getDiagramEditPart().getConnections().size());
	}

	MouseEvent createMouseEvent(int x, int y) {
		Event e = new Event();

		e.widget = getDiagramEditPart().getViewer().getControl();
		;
		e.display = e.widget.getDisplay();
		e.button = 1; // left button
		e.x = x;
		e.y = y;

		return new MouseEvent(e);
	}

}
