package models;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import ij.plugin.filter.PlugInFilter;
import java.awt.Point;
import org.junit.Test;
import de.danielsenff.imageflow.models.SelectionList;
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.connection.ProxyOutput;
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.GroupUnitElement;
import de.danielsenff.imageflow.models.unit.UnitElement;
import de.danielsenff.imageflow.models.unit.UnitList;
public class DataTypeTests extends UnitElementTests{
@Test
public void testDataTypeInteger() {
DataType integer1 = DataTypeFactory.createInteger();
DataType integer2 = DataTypeFactory.createInteger();
DataType image1 = DataTypeFactory.createImage(PlugInFilter.DOES_32);
assertTrue("int on int", integer1.isCompatible(integer2));
assertTrue("int on int", integer2.isCompatible(integer1));
assertFalse("int on img", integer1.isCompatible(image1));
assertFalse("img on int", image1.isCompatible(integer1));
}
/*
* Image
*/
@Test public void testInputImageBitDepthCompatible() {
UnitElement unit1 = createSourceUnit();
Output output_32 = unit1.getOutput(0); // 32
Output output_all = unit1.getOutput(1); // all
Output output_m1 = unit1.getOutput(2); // -1
Output output_3216 = unit1.getOutput(3); // -1
UnitElement unit2 = createSinkUnit();
Input input_32 = unit2.getInput(0); // 32
Input input_16 = unit2.getInput(1); // 16
Input input_all = unit2.getInput(2); // all
Input input_3216 = unit2.getInput(3); // 32/16
// strictly determined
assertTrue("both do 32", input_32.isCompatible(output_32));
assertFalse("32 to 16", input_16.isCompatible(output_32));
assertTrue("32 to all", input_all.isCompatible(output_32));
assertTrue("32 to 31/16", input_3216.isCompatible(output_32));
// undetermined output
// ok, technically ALL to 32 does work, but since the input tests for a concrete type,
// and not for a could-be, this is false
//FIXME technically it is always possible to assign an output as all, this just breaks the system
// assertFalse("all to 32", input_32.isCompatible(output_all));
// assertFalse("all to 32/16", input_32.isCompatible(output_3216));
assertFalse("-1 to 32", input_32.isCompatible(output_m1));
assertFalse("-1 to all", input_16.isCompatible(output_m1));
assertFalse("-1 to 31/16", input_3216.isCompatible(output_m1));
// this are also undetermined
assertTrue("32/16 to 16", input_16.isCompatible(output_3216));
assertTrue("32/16 to 16", input_32.isCompatible(output_3216));
}
@Test public void testOutputImageBitDepthCompatible() {
UnitElement unit1 = createSourceUnit();
Output output_32 = unit1.getOutput(0); // 32
Output output_all = unit1.getOutput(1); // all
Output output_m1 = unit1.getOutput(2); // -1
Output output_3216 = unit1.getOutput(3); // -1
UnitElement unit2 = createSinkUnit();
Input input_32 = unit2.getInput(0); // 32
Input input_16 = unit2.getInput(1); // 16
Input input_all = unit2.getInput(2); // all
Input input_3216 = unit2.getInput(3); // all
// output determined
assertTrue("both do 32", output_32.isCompatible(input_32));
assertTrue("32 to all", output_32.isCompatible(input_all));
assertTrue("32 to 32/16", output_32.isCompatible(input_3216));
assertFalse("32 to 16", output_32.isCompatible(input_16));
assertFalse("32 to 16", output_32.isCompatible(input_16));
// undetermined
// ok, technically ALL to 32 does work, but since the input tests for a concrete type,
// and not for a could-be, this is false
// assertFalse("All to 32", output_all.isCompatible(input_32));
// assertFalse("32 to 32/16", output_3216.isCompatible(input_3216));
// assertFalse("32 to 32/16", output_3216.isCompatible(input_32));
assertFalse("-1 to 16", output_m1.isCompatible(input_16));
assertFalse("-1 to 16", output_m1.isCompatible(input_all));
assertFalse("-1 to 16", output_m1.isCompatible(input_32));
}
/*
* We have 3 units
* the first one has a determined output datatype
* the second takes it and passes it through
* the third has the actual comparison
*/
@Test public void testBubbleInput_32_m1_32() {
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
UnitElement unit2 = createUnit(PlugInFilter.DOES_32, -1);
UnitElement unit3 = createUnit(PlugInFilter.DOES_32, PlugInFilter.DOES_32);
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
conn_1_2.connect();
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
conn_2_3.connect();
assertTrue(conn_1_2.isConnected());
assertTrue(conn_2_3.isConnected());
assertTrue(conn_1_2.isCompatible());
assertTrue(conn_2_3.isCompatible());
}
@Test public void testBubbleInput_32_all_all() {
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
UnitElement unit2 = createUnit(PlugInFilter.DOES_ALL, -1);
UnitElement unit3 = createUnit(PlugInFilter.DOES_ALL, PlugInFilter.DOES_32);
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
conn_1_2.connect();
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
conn_2_3.connect();
assertTrue(conn_1_2.isConnected());
assertTrue(conn_2_3.isConnected());
assertTrue(conn_1_2.isCompatible());
assertTrue(conn_2_3.isCompatible());
}
@Test public void testBubbleInput_32_m1_16() {
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
UnitElement unit2 = createUnit(PlugInFilter.DOES_32, -1);
UnitElement unit3 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
conn_1_2.connect();
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
conn_2_3.connect();
assertTrue(conn_1_2.isConnected());
assertTrue(conn_2_3.isConnected());
assertTrue(conn_1_2.isCompatible());
assertFalse(conn_2_3.isCompatible());
}
@Test public void testBubbleInput_16_1632_32() {
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_16);
UnitElement unit2 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
UnitElement unit3 = createUnit(PlugInFilter.DOES_32, PlugInFilter.DOES_32);
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
conn_1_2.connect();
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
conn_2_3.connect();
assertTrue(conn_1_2.isConnected());
assertTrue(conn_2_3.isConnected());
assertTrue(conn_1_2.isCompatible());
assertTrue(conn_2_3.isCompatible());
}
@Test public void testBubbleInput_8c_1632_ALL() {
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_8C);
UnitElement unit2 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
UnitElement unit3 = createUnit(PlugInFilter.DOES_ALL, PlugInFilter.DOES_32);
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
conn_1_2.connect();
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
conn_2_3.connect();
assertTrue(conn_1_2.isConnected());
assertTrue(conn_2_3.isConnected());
assertFalse(conn_1_2.isCompatible());
assertTrue(conn_2_3.isCompatible());
}
@Test public void testBubbleInput_8c_1632_1632() {
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_8C);
UnitElement unit2 = createUnit(PlugInFilter.DOES_16&PlugInFilter.DOES_8G, PlugInFilter.DOES_32);
UnitElement unit3 = createUnit(PlugInFilter.DOES_16&PlugInFilter.DOES_32, PlugInFilter.DOES_32);
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
conn_1_2.connect();
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
conn_2_3.connect();
assertTrue(conn_1_2.isConnected());
assertTrue(conn_2_3.isConnected());
assertFalse(conn_1_2.isCompatible());
assertFalse(conn_2_3.isCompatible());
}
/**
* test bubbling through a group
* 1 unit outputting a determined value
* 2 group
* - unit taking input
* - unit taking input
* 3 unit taking input
*
*/
@Test public void testBubbleGroupInput_8c_1632_1632() {
UnitList units = new UnitList();
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
units.add(unit1);
UnitElement unit2 = createUnit(PlugInFilter.DOES_ALL, -1);
units.add(unit2);
UnitElement unit3 = createUnit(PlugInFilter.DOES_ALL, -1);
units.add(unit3);
UnitElement unit4 = createUnit(PlugInFilter.DOES_ALL, -1);
units.add(unit4);
UnitElement unit5 = createUnit(PlugInFilter.DOES_32, PlugInFilter.DOES_32);
units.add(unit5);
ConnectionList connList = units.getConnections();
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
connList.add(conn_1_2);
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
connList.add(conn_2_3);
Connection conn_3_4 = new Connection(unit3, 1, unit4, 1);
connList.add(conn_3_4);
Connection conn_4_5 = new Connection(unit4, 1, unit5, 1);
connList.add(conn_4_5);
for (Connection connection : connList) {
assertTrue(connection.isConnected());
assertTrue(connection.isCompatible());
}
SelectionList selections = new SelectionList();
selections.add(unit2);
selections.add(unit3);
GroupUnitElement group = new GroupUnitElement(new Point(33, 55), "group", selections, units);
units.add(group);
assertEquals("number of inputs", 1, group.getInputsCount());
assertEquals("number of outputs", 1, group.getOutputsCount());
assertEquals("number of internal connection", 1, group.getInternalConnections().size());
for (Connection connection : units.getConnections()) {
assertTrue(connection.isConnected());
assertTrue(connection.isCompatible());
}
Connection connToGroup = group.getInput(0).getConnection();
assertTrue(connToGroup.isConnected());
assertTrue(connToGroup.isCompatible());
for (Connection connFromGroup : group.getOutput(0).getConnections()) {
assertTrue(connFromGroup.isConnected());
assertTrue(connFromGroup.isCompatible());
}
}
@Test public void testBubbleSourceGroupInput_1632_1632() {
UnitList units = new UnitList();
UnitElement unit1 = createUnit(PlugInFilter.DOES_16, PlugInFilter.DOES_32);
units.add(unit1);
UnitElement unit2 = createUnit(PlugInFilter.DOES_ALL, -1);
units.add(unit2);
UnitElement unit3 = createUnit(PlugInFilter.DOES_ALL, -1);
units.add(unit3);
UnitElement unit4 = createUnit(PlugInFilter.DOES_ALL, -1);
units.add(unit4);
UnitElement unit5 = createUnit(PlugInFilter.DOES_32, PlugInFilter.DOES_32);
units.add(unit5);
ConnectionList connList = units.getConnections();
Connection conn_1_2 = new Connection(unit1, 1, unit2, 1);
connList.add(conn_1_2);
Connection conn_2_3 = new Connection(unit2, 1, unit3, 1);
connList.add(conn_2_3);
Connection conn_3_4 = new Connection(unit3, 1, unit4, 1);
connList.add(conn_3_4);
Connection conn_4_5 = new Connection(unit4, 1, unit5, 1);
connList.add(conn_4_5);
for (Connection connection : connList) {
connection.isConnected();
connection.isCompatible();
}
SelectionList selections = new SelectionList();
selections.add(unit1);
selections.add(unit2);
selections.add(unit3);
GroupUnitElement group = new GroupUnitElement(new Point(33, 55), "group", selections, units);
for (Connection connection : group.getInternalConnections()) {
assertTrue(connection.isConnected());
}
assertEquals("number of inputs", 0, group.getInputsCount());
assertEquals("number of outputs", 1, group.getOutputsCount());
assertEquals("number of internal connection", 2, group.getInternalConnections().size());
assertEquals("number of connections", 2, units.getConnections().size());
assertEquals("number of units",2 , units.size());
assertEquals("number of grouped units",3 , group.getNodes().size());
ProxyOutput groupOutput = (ProxyOutput)group.getOutput(0);
ImageDataType dtImage = (ImageDataType)groupOutput.getDataType();
assertEquals(8, dtImage.getImageBitDepth());
assertTrue(dtImage.isImageBitDepthCompatible(8));
units.add(group);
for (Connection connection : units.getConnections()) {
assertTrue(connection.isConnected());
assertTrue(connection.isCompatible());
}
for (Connection connFromGroup : groupOutput.getConnections()) {
assertTrue(connFromGroup.isConnected());
assertTrue("compatibility for "+connFromGroup, connFromGroup.isCompatible());
}
}
}