package net.sf.taverna.t2.workbench.file.importworkflow;

import org.junit.Ignore;
import org.junit.Test;

import uk.org.taverna.scufl2.api.core.Workflow;

@Ignore
public class TestRename extends AbstractTestHelper {

	@Test
	public void mergePintoP() throws Exception {
		DataflowMerger merger = new DataflowMerger(p);
		merger.getMergeEdit(p).doEdit();
		Workflow merged = p;

		assertHasProcessors(merged, "P", "P_2");
		assertHasInputPorts(merged, "i", "i_2");
		assertHasOutputPorts(merged, "o", "o_2");
		assertHasDatalinks(merged, "i->P.inputlist", "P.outputlist->o",
				"i_2->P_2.inputlist", "P_2.outputlist->o_2");
	}

	@Test
	public void mergePintoPintoP() throws Exception {
		// Don't put p in constructor, or we would get exponential merging!
		Workflow merged = new Workflow();
		DataflowMerger merger = new DataflowMerger(merged);
		merger.getMergeEdit(p).doEdit();
		merger.getMergeEdit(p).doEdit();
		merger.getMergeEdit(p).doEdit();

		assertHasProcessors(merged, "P", "P_2", "P_3");
		assertHasInputPorts(merged, "i", "i_2", "i_3");
		assertHasOutputPorts(merged, "o", "o_2", "o_3");
		assertHasDatalinks(merged, "i->P.inputlist", "P.outputlist->o",
				"i_2->P_2.inputlist", "P_2.outputlist->o_2",
				"i_3->P_3.inputlist", "P_3.outputlist->o_3");
	}

	@Test
	public void mergePintoPWithPrefix() throws Exception {
		// Don't put p in constructor, or we would get exponential merging!
		Workflow merged = new Workflow();
		DataflowMerger merger = new DataflowMerger(merged);
		merger.getMergeEdit(p).doEdit();
		merger.getMergeEdit(p, "fish_").doEdit();
		merger.getMergeEdit(p, "soup_").doEdit();

		assertHasProcessors(merged, "P", "fish_P", "soup_P");
		assertHasInputPorts(merged, "i", "fish_i", "soup_i");
		assertHasOutputPorts(merged, "o", "fish_o", "soup_o");
		assertHasDatalinks(merged, "i->P.inputlist", "P.outputlist->o",
				"fish_i->fish_P.inputlist", "fish_P.outputlist->fish_o",
				"soup_i->soup_P.inputlist", "soup_P.outputlist->soup_o");
	}

}
