/*******************************************************************************
 * Copyright (C) 2007 The University of Manchester   
 * 
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 * 
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1 of
 *  the License, or (at your option) any later version.
 *    
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *    
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.workflowmodel.impl;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
//import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import net.sf.taverna.t2.workflowmodel.Datalink;
import net.sf.taverna.t2.workflowmodel.Edit;
import net.sf.taverna.t2.workflowmodel.EditException;
import net.sf.taverna.t2.workflowmodel.Edits;
import net.sf.taverna.t2.workflowmodel.EventForwardingOutputPort;
import net.sf.taverna.t2.workflowmodel.EventHandlingInputPort;
import net.sf.taverna.t2.workflowmodel.Merge;
import net.sf.taverna.t2.workflowmodel.MergeInputPort;
import net.sf.taverna.t2.workflowmodel.MergeOutputPort;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class ConnectMergedDatalinkEditTest {
	private static Edits edits;

	@BeforeClass
	public static void createEditsInstance() {
		edits = new EditsImpl();
	}

	EventForwardingOutputPort sourcePort;
	EventHandlingInputPort sinkPort;
	Merge merge;
	
	@Before
	public void setup() throws Exception {
		merge = new MergeImpl("theMerge");
		ProcessorImpl p1 = new ProcessorImpl();
		ProcessorImpl p2 = new ProcessorImpl();
		sourcePort=new ProcessorOutputPortImpl(p1,"source_port",0,0);
		sinkPort=new ProcessorInputPortImpl(p2,"sink_port",0);
	}
	
	@Test
	public void applyEdit() throws Exception {
		Edit<Merge> theEdit = edits.getConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
		assertEquals(0,merge.getInputPorts().size());
		assertNotNull(merge.getOutputPort());
		assertTrue(merge.getOutputPort() instanceof MergeOutputPort);
		assertEquals(0,merge.getOutputPort().getOutgoingLinks().size());
		
		assertSame(merge,((MergeOutputPort)merge.getOutputPort()).getMerge());
		
		theEdit.doEdit();
		assertEquals(1,merge.getInputPorts().size());
		assertTrue(merge.getInputPorts().get(0) instanceof MergeInputPort);
		assertEquals("source_portTotheMerge_input0",merge.getInputPorts().get(0).getName());
		assertSame(sourcePort,merge.getInputPorts().get(0).getIncomingLink().getSource());
		
		assertEquals(1,merge.getOutputPort().getOutgoingLinks().size());
		assertSame(sinkPort,merge.getOutputPort().getOutgoingLinks().toArray(new Datalink[]{})[0].getSink());
		
		assertEquals(1,sourcePort.getOutgoingLinks().size());
		assertTrue(sourcePort.getOutgoingLinks().toArray(new Datalink[]{})[0].getSink() instanceof MergeInputPort);
		assertTrue(sinkPort.getIncomingLink().getSource() instanceof MergeOutputPort);
		
		assertSame(merge.getInputPorts().get(0),sourcePort.getOutgoingLinks().toArray(new Datalink[]{})[0].getSink());
		assertSame(sinkPort.getIncomingLink().getSource(),merge.getOutputPort());
		
		ProcessorImpl p3=new ProcessorImpl();
		ProcessorOutputPortImpl sourcePort2=new ProcessorOutputPortImpl(p3,"source_port2",0,0);
		
		Edit<Merge> theEdit2 = edits.getConnectMergedDatalinkEdit(merge,sourcePort2,sinkPort);
		theEdit2.doEdit();
		assertEquals(1,merge.getOutputPort().getOutgoingLinks().size());
		assertEquals(2,merge.getInputPorts().size());
		assertTrue(merge.getInputPorts().get(1) instanceof MergeInputPort);
		assertEquals("source_port2TotheMerge_input0",merge.getInputPorts().get(1).getName());
		assertSame(sourcePort2,merge.getInputPorts().get(1).getIncomingLink().getSource());
	}
	
	@Test(expected=RuntimeException.class)
	public void nullMerge() throws Exception {
		edits.getConnectMergedDatalinkEdit(null,sourcePort,sinkPort);
	}
	
	@Test(expected=RuntimeException.class)
	public void nullSourcePort() throws Exception {
		Merge merge = new MergeImpl("merge");
		edits.getConnectMergedDatalinkEdit(merge,sourcePort,null);
	}
	
	@Test(expected=RuntimeException.class)
	public void nullSinkPort() throws Exception {
		Merge merge = new MergeImpl("merge");
		edits.getConnectMergedDatalinkEdit(merge,null,sinkPort);
	}
	
	@Test(expected=EditException.class)
	public void invalidSinkPort() throws Exception {
		Edit<Merge> theEdit = edits.getConnectMergedDatalinkEdit(merge,sourcePort,sinkPort);
		theEdit.doEdit();
		
		ProcessorImpl p2=new ProcessorImpl();
		ProcessorInputPortImpl sinkPort2=new ProcessorInputPortImpl(p2,"sink_port2",0);
		theEdit = edits.getConnectMergedDatalinkEdit(merge,sourcePort,sinkPort2);
		theEdit.doEdit();
		
	}
}
