package models;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import ij.plugin.filter.PlugInFilter;
import java.awt.Dimension;
import org.junit.Test;
import de.danielsenff.imageflow.models.connection.Connection;
import de.danielsenff.imageflow.models.connection.ConnectionList;
import de.danielsenff.imageflow.models.connection.Input;
import de.danielsenff.imageflow.models.connection.Output;
import de.danielsenff.imageflow.models.datatype.DataType;
import de.danielsenff.imageflow.models.datatype.DataTypeFactory;
import de.danielsenff.imageflow.models.datatype.ImageDataType;
import de.danielsenff.imageflow.models.unit.UnitElement;
public class OutputTests {
@Test public void testImageTitle() {
// image title of style "Unit_1_Output_1"
// test output-only
UnitElement sourceUnit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12));
// test input/output case
UnitElement filterUnit1 = UnitFactoryExt.createAddNoiseUnit();
UnitElement filterUnit2 = UnitFactoryExt.createAddNoiseUnit();
Output sourceOutput = sourceUnit.getOutput(0);
Input filter1Input = filterUnit1.getInput(0);
Output filter1Output = filterUnit1.getOutput(0);
Connection conn1 = new Connection(sourceUnit, 1, filterUnit1, 1);
Connection conn2 = new Connection(sourceUnit, 1, filterUnit2, 1);
conn1.connect();
assertTrue(conn1.isConnected());
conn2.connect();
assertTrue(conn2.isConnected());
// the imagetitle is constructed from the unit and pin the
// connection comes from and the
assertEquals("imagetitle for output 1 at unit 1",
"Unit_"+sourceUnit.getNodeID()+"_Output_1", sourceOutput.getOutputTitle());
assertEquals("imagetitle for input 1 at unit 2",
"Unit_"+sourceUnit.getNodeID()+"_Output_1", filter1Input.getImageTitle());
assertNotNull("imagetitle for output 1 at unit 2", filter1Output.getOutputTitle());
}
@Test public void testIsConnected() {
// test output-only
UnitElement sourceUnit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12));
// test input/output case
UnitElement filterUnit1 = UnitFactoryExt.createAddNoiseUnit();
UnitElement filterUnit2 = UnitFactoryExt.createAddNoiseUnit();
Output sourceOutput = sourceUnit.getOutput(0);
// test beforehand
assertFalse("output not connected", sourceOutput.isConnected());
Connection conn = new Connection(sourceUnit, 1, filterUnit1, 1);
ConnectionList connList = new ConnectionList();
connList.add(conn);
// test after connecting
assertTrue("output connected", sourceOutput.isConnected());
assertFalse("output connected", filterUnit2.getOutput(0).isConnected());
}
@Test public void testIsConnectedWith() {
// test output-only
UnitElement source1Unit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12));
Output source1Output = source1Unit.getOutput(0);
UnitElement source2Unit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12));
Output source2Output = source2Unit.getOutput(0);
// test input/output case
UnitElement filterUnit1 = UnitFactoryExt.createAddNoiseUnit();
Input filter1Input = filterUnit1.getInput(0);
UnitElement filterUnit2 = UnitFactoryExt.createAddNoiseUnit();
Input filter2Input = filterUnit2.getInput(0);
// test beforehand
assertFalse("output not connected with filter1Input",
source1Output.isConnectedWith(filter1Input));
assertFalse("output not connected with filter2Input",
source1Output.isConnectedWith(filter2Input));
Connection conn = new Connection(source1Unit, 1, filterUnit1, 1);
// ConnectionList connList = new ConnectionList();
// connList.add(conn);
conn.connect();
// test after connecting
assertTrue("Connection connected correctly", conn.isConnected());
assertTrue("output connected with filter1Input",
source1Output.isConnectedWith(filter1Input));
assertFalse("output not connected with filter2Input",
source1Output.isConnectedWith(filter2Input));
}
@Test public void testIsDisconnected() {
// test output-only
UnitElement sourceUnit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12));
// test input/output case
UnitElement filterUnit1 = UnitFactoryExt.createAddNoiseUnit();
UnitElement filterUnit2 = UnitFactoryExt.createAddNoiseUnit();
Output sourceOutput = sourceUnit.getOutput(0);
ConnectionList connList = new ConnectionList();
// test after connecting
Connection conn = new Connection(sourceUnit, 1, filterUnit1, 1);
assertTrue("connection added to list", connList.add(conn));
assertTrue("output connected", sourceOutput.isConnected());
assertFalse("output connected", filterUnit2.getOutput(0).isConnected());
connList.remove(conn);
//test after disconnecting
assertFalse("output disconnected", sourceOutput.isConnected());
assertFalse("output connected", filterUnit2.getOutput(0).isConnected());
}
public String verboseBitDepth(int imagetype) {
switch(imagetype) {
case PlugInFilter.DOES_16:
return "DOES_16";
case PlugInFilter.DOES_32:
return "DOES_32";
case PlugInFilter.DOES_8G:
return "DOES_8G";
case PlugInFilter.DOES_8C:
return "DOES_8C";
case PlugInFilter.DOES_RGB:
return "DOES_RGB";
case PlugInFilter.DOES_ALL:
return "DOES_ALL";
case PlugInFilter.DOES_STACKS:
return "DOES_STACKS";
case -1:
return "predecessor type";
}
return "unknown";
}
public void traverseImageBitDepth(final int unit1Obitdepth,
final int unit2Ibitdepth, final int unit2Obitdepth,
final int unit3Ibitdepth,
final boolean expFirstConn, final boolean expScndConn) {
UnitElement unit1 = new UnitElement("unit1", "some syntax");
DataType dataType = DataTypeFactory.createImage(unit1Obitdepth);
unit1.addOutput(new Output(dataType, unit1, 1));
// unit1.addOutput("output1", "o", unit1Obitdepth, false);
UnitElement unit2 = new UnitElement("unit2", "some syntax");
unit2.addInput(new Input("input1", "i",DataTypeFactory.createImage(unit2Ibitdepth),unit2, 1, true, false));
unit2.addOutput(new Output("output1", "o", DataTypeFactory.createImage(unit2Obitdepth), unit2, 1));
UnitElement unit3 = new UnitElement("unit3", "some syntax");
unit3.addInput(new Input("input1", "i",DataTypeFactory.createImage(unit3Ibitdepth),unit3, 1, true, false));
Connection conn1 = new Connection(unit1, 1, unit2, 1); // 32 to 32
conn1.connect();
assertEquals("Conn1: "+verboseBitDepth(unit1Obitdepth)+" to "+ verboseBitDepth(unit2Ibitdepth),
expFirstConn, conn1.isCompatible());
Connection conn2 = new Connection(unit2, 1, unit3, 1); // 32 to 32
conn2.connect();
assertEquals("Conn2: "+verboseBitDepth(unit2Obitdepth)+" to "+ verboseBitDepth(unit3Ibitdepth),
expScndConn, conn2.isCompatible());
}
@Test public void testImageBitDepthTraversing() {
traverseImageBitDepth(PlugInFilter.DOES_32, //unit 1 output
PlugInFilter.DOES_32, PlugInFilter.DOES_32, //unit2 input, output
PlugInFilter.DOES_32, true, true); // unit 3, expectations
traverseImageBitDepth(PlugInFilter.DOES_32, //unit 1 output
PlugInFilter.DOES_ALL, PlugInFilter.DOES_32, //unit2 input, output
PlugInFilter.DOES_ALL, true, true); // unit 3, expectations
traverseImageBitDepth(PlugInFilter.DOES_32, //unit 1 output
PlugInFilter.DOES_ALL, PlugInFilter.DOES_32, //unit2 input, output
PlugInFilter.DOES_16, true, false); // unit 3, expectations
traverseImageBitDepth(PlugInFilter.DOES_32, //unit 1 output
PlugInFilter.DOES_16, PlugInFilter.DOES_32, //unit2 input, output
PlugInFilter.DOES_32, false, true); // unit 3, expectations
traverseImageBitDepth(PlugInFilter.DOES_32, //unit 1 output
PlugInFilter.DOES_ALL, -1, //unit2 input, output
PlugInFilter.DOES_32, true, true); // unit 3, expectations
traverseImageBitDepth(PlugInFilter.DOES_16, //unit 1 output
PlugInFilter.DOES_ALL, -1, //unit2 input, output
PlugInFilter.DOES_32, true, false); // unit 3, expectations
traverseImageBitDepth(PlugInFilter.DOES_16, //unit 1 output
PlugInFilter.DOES_ALL, -1, //unit2 input, output
PlugInFilter.DOES_ALL, true, true); // unit 3, expectations
}
@Test public void testTraversingImageBitDepth() {
UnitElement unit1 = new UnitElement("unit1", "some syntax");
Output output1 = new Output("output1", "o", DataTypeFactory.createImage(PlugInFilter.DOES_ALL), unit1, 1);
unit1.addOutput(output1);
UnitElement unit2 = new UnitElement("unit2", "some syntax");
Input input1 = new Input("input1", "i",DataTypeFactory.createImage(PlugInFilter.DOES_ALL),unit2, 1, true, false);
unit2.addInput(input1);
Output output2 = new Output("output1", "o", DataTypeFactory.createImage(-1), unit2, 1);
unit2.addOutput(output2);
// UnitElement unit3 = new UnitElement("unit3", "some syntax");
// unit3.addInput("input1", "i", unit3Ibitdepth, false);
Connection conn1 = new Connection(unit1, 1, unit2, 1);
conn1.connect();
ImageDataType o1dT = ((ImageDataType)output1.getDataType());
assertTrue("travers from DOES_32",
o1dT.isImageBitDepthCompatible(PlugInFilter.DOES_32));
assertTrue("travers from DOES_16",
o1dT.isImageBitDepthCompatible(PlugInFilter.DOES_16));
ImageDataType o2dT = ((ImageDataType)output2.getDataType());
assertTrue("travers from DOES_32 via DOES_ALL to -1",
o2dT.isImageBitDepthCompatible(PlugInFilter.DOES_32));
// if the source is DOES_ALL we can't say for sure what comes, but we have to accept
assertTrue("travers from DOES_32 via DOES_ALL to -1",
o2dT.isImageBitDepthCompatible(PlugInFilter.DOES_16));
}
@Test public void testLoopScenario1() {
UnitElement unit1 = UnitFactoryExt.createFindEdgesUnit();
UnitElement unit2 = UnitFactoryExt.createImageCalculatorUnit();
UnitElement unit3 = UnitFactoryExt.createAddNoiseUnit();
UnitElement unit4 = UnitFactoryExt.createGaussianBlurUnit();
Connection conn1 = new Connection(unit1, 1, unit2, 1);
conn1.connect();
assertTrue(conn1.isConnected());
Connection conn2 = new Connection(unit3, 1, unit2, 2);
conn2.connect();
assertTrue(conn2.isConnected());
Output outputU2 = unit2.getOutput(0);
Input inputU4 = unit4.getInput(0);
assertFalse(outputU2.existsInInputSubgraph(unit4));
assertFalse(inputU4.isConnectedInInputBranch(unit2));
// now we create a loop
Connection conn3 = new Connection(unit4, 1, unit1, 1);
conn3.connect();
assertTrue(conn3.isConnected());
assertTrue(outputU2.existsInInputSubgraph(unit4));
assertTrue(inputU4.isConnectedInInputBranch(unit2));
}
@Test public void testLoopScenario2() {
UnitElement unit1 = UnitFactoryExt.createFindEdgesUnit();
UnitElement unit2 = UnitFactoryExt.createImageCalculatorUnit();
UnitElement unit4 = UnitFactoryExt.createGaussianBlurUnit();
Connection conn1 = new Connection(unit1, 1, unit2, 1);
conn1.connect();
Connection conn2 = new Connection(unit1, 1, unit2, 2);
conn2.connect();
assertTrue(conn2.isConnected());
Output outputU2 = unit2.getOutput(0);
Input inputU4 = unit4.getInput(0);
assertFalse(outputU2.existsInInputSubgraph(unit4));
assertFalse(inputU4.isConnectedInOutputBranch(unit2));
// now we create a loop
Connection conn3 = new Connection(unit4, 1, unit1, 1);
conn3.connect();
assertTrue(conn3.isConnected());
assertTrue(outputU2.existsInInputSubgraph(unit4));
assertTrue(inputU4.isConnectedInOutputBranch(unit2));
}
@Test public void testLoopScenario3() {
UnitElement unit1 = UnitFactoryExt.createFindEdgesUnit();
UnitElement unit4 = UnitFactoryExt.createGaussianBlurUnit();
Output outputU1 = unit1.getOutput(0);
Input inputU4 = unit4.getInput(0);
assertFalse(outputU1.existsInInputSubgraph(unit4));
assertFalse(inputU4.isConnectedInOutputBranch(unit1));
//connecting first time
Connection conn1 = new Connection(unit1, 1, unit4, 1);
conn1.connect();
assertTrue(conn1.isConnected());
assertFalse(outputU1.existsInInputSubgraph(unit4));
assertFalse(inputU4.isConnectedInOutputBranch(unit1));
// creating the same connection a second time
Connection conn3 = new Connection(unit4, 1, unit1, 1);
conn3.connect();
assertTrue(conn3.isConnected());
// assertFalse(conn1.isConnected());
}
@Test public void testUnitConnectedInBranch() {
UnitElement unit1 = UnitFactoryExt.createAddNoiseUnit();
Output output1 = unit1.getOutput(0);
UnitElement unit2 = UnitFactoryExt.createAddNoiseUnit();
Output output2 = unit2.getOutput(0);
UnitElement unit3 = UnitFactoryExt.createAddNoiseUnit();
Connection conn1 = new Connection(unit1, 1, unit2, 1);
ConnectionList connList = new ConnectionList();
connList.add(conn1);
assertTrue("output2 knows unit1", output2.existsInInputSubgraph(unit1));
assertTrue("output2 knows unit2", output2.existsInInputSubgraph(unit2));
assertFalse("output2 knows unit3", output2.existsInInputSubgraph(unit3));
Connection conn2 = new Connection(unit2, 1, unit3, 1);
assertTrue("output2 knows unit1", output2.existsInInputSubgraph(unit1));
assertTrue("output2 knows unit2", output2.existsInInputSubgraph(unit2));
assertFalse("output2 knows unit3", output2.existsInInputSubgraph(unit3));
/*
* output 1 is on a source, so it has no input branch
*/
assertTrue("output1 knows unit1", output1.existsInInputSubgraph(unit1));
assertFalse("output1 knows unit2", output1.existsInInputSubgraph(unit2));
assertFalse("output1 knows unit3", output2.existsInInputSubgraph(unit3));
connList.add(conn2);
assertTrue("output1 knows unit1", output1.existsInInputSubgraph(unit1));
assertFalse("output1 knows unit2", output1.existsInInputSubgraph(unit2));
assertFalse("output1 knows unit3", output1.existsInInputSubgraph(unit3));
}
}