/*******************************************************************************
 * 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.activities.wsdl.xmlsplitter;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import net.sf.taverna.t2.activities.testutils.LocationConstants;
import net.sf.taverna.t2.activities.wsdl.WSDLActivity;
import net.sf.taverna.t2.workflowmodel.Edits;
import net.sf.taverna.t2.workflowmodel.Processor;
import net.sf.taverna.t2.workflowmodel.impl.DataflowImpl;
import net.sf.taverna.t2.workflowmodel.impl.EditsImpl;
import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class AddXMLSplitterEditTest implements LocationConstants {

	private static final JsonNodeFactory JSON_NODE_FACTORY = JsonNodeFactory.instance;

	private WSDLActivity activity;
	private DataflowImpl dataflow;
	private ObjectNode configBean;
	private static ObjectNode operationConfigBean;
	private String wsdlLocation = WSDL_TEST_BASE
	+ "eutils/eutils_lite.wsdl";
	private Edits edits;

	@Ignore("Integration test")
	@Before
	public void setUp() throws Exception {
		activity = new WSDLActivity(null);
		configBean = JSON_NODE_FACTORY.objectNode();
		operationConfigBean = configBean.objectNode();
		configBean.put("operation", operationConfigBean);
		operationConfigBean.put("name", "run_eInfo");
		operationConfigBean.put("wsdl", wsdlLocation);
		activity.configure(configBean);
		edits = new EditsImpl();

		dataflow = (DataflowImpl)edits.createDataflow();
		Processor p=edits.createProcessor("run_eInfo");
		edits.getDefaultDispatchStackEdit(p).doEdit();
		edits.getAddActivityEdit(p, activity).doEdit();
		edits.getMapProcessorPortsForActivityEdit(p).doEdit();
		edits.getAddProcessorEdit(dataflow, p).doEdit();

	}

	@Ignore("Integration test")
	@Test
	public void testAddOutputSplitterToWSDLActivity() throws Exception {
		AddXMLSplitterEdit edit = new AddXMLSplitterEdit(dataflow,activity,"parameters",false, new EditsImpl());
		edit.doEdit();
		assertEquals("The workflow should now contain 2 services",2,dataflow.getProcessors().size());
		Processor processor=null;
		for (Processor p : dataflow.getProcessors()) {
			if (p.getLocalName().equals("parametersXML")) {
				processor = p;
				break;
			}
		}
		assertNotNull("There should be a processor named parametersXML",processor);
		assertEquals("There should be 1 activity",1,processor.getActivityList().size());

		assertEquals("The processor should have 3 output ports",3,processor.getOutputPorts().size());
		assertEquals("The processor should have 1 input port",1,processor.getInputPorts().size());

		Activity<?>a = processor.getActivityList().get(0);
		assertEquals("The activity should have 3 output ports",3,a.getOutputPorts().size());
		assertEquals("The activity should have 1 input port",1,a.getInputPorts().size());

		assertEquals("There should be 1 datalink",1,dataflow.getLinks().size());
	}

	@Ignore("Integration test")
	@Test
	public void testUndo() throws Exception {
		AddXMLSplitterEdit edit = new AddXMLSplitterEdit(dataflow,activity,"parameters",false, new EditsImpl());
		edit.doEdit();
		edit.undo();
		assertEquals("There should be only 1 processor",1,dataflow.getProcessors().size());
		assertEquals("The processor should be called run_eInfo","run_eInfo",dataflow.getProcessors().get(0).getLocalName());
		assertEquals("There should be no datalinks",0,dataflow.getLinks().size());
	}

	@Ignore("Integration test")
	@Test
	public void testAddInputSplitterToWSDLActivity() throws Exception {
		AddXMLSplitterEdit edit = new AddXMLSplitterEdit(dataflow,activity,"parameters",true, new EditsImpl());
		edit.doEdit();
		assertEquals("The workflow should now contain 2 services",2,dataflow.getProcessors().size());
		Processor processor=null;
		for (Processor p : dataflow.getProcessors()) {
			if (p.getLocalName().equals("parametersXML")) {
				processor = p;
				break;
			}
		}
		assertNotNull("There should be a processor named parametersXML",processor);
		assertEquals("There should be 1 activity",1,processor.getActivityList().size());
		assertEquals("THe processor should have 3 input ports",3,processor.getInputPorts().size());
		assertEquals("THe processor should have 1 output port",1,processor.getOutputPorts().size());

		Activity<?>a = processor.getActivityList().get(0);

		assertEquals("The activity should have 3 input ports",3,a.getInputPorts().size());
		assertEquals("The activity 1 output port",1,a.getOutputPorts().size());

		assertEquals("There should be 1 datalink",1,dataflow.getLinks().size());
	}

}
