/** * */ package models; import ij.plugin.filter.PlugInFilter; import java.awt.Dimension; import java.awt.Point; import de.danielsenff.imageflow.models.MacroElement; 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.DataTypeFactory; import de.danielsenff.imageflow.models.parameter.ParameterFactory; import de.danielsenff.imageflow.models.unit.UnitElement; import de.danielsenff.imageflow.models.unit.UnitElement.Type; import org.junit.Test; import static org.junit.Assert.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @author danielsenff * */ public class UnitElementTests { @Test public void testInputsActualCount() { UnitElement unit = UnitFactoryExt.createAddNoiseUnit(); assertEquals("number outputs",1, unit.getOutputsCount()); assertEquals("number inputs",1, unit.getInputsCount()); UnitElement source = UnitFactoryExt.createBackgroundUnit(new Dimension(100,100)); assertEquals("number outputs",1, source.getOutputsCount()); assertEquals("number inputs",0, source.getInputsCount()); UnitElement merge = UnitFactoryExt.createImageCalculatorUnit(); assertEquals("number outputs",1, merge.getOutputsCount()); assertEquals("number inputs",2, merge.getInputsCount()); UnitElement sink = UnitFactoryExt.createHistogramUnit(new Point(0,0)); assertEquals("number outputs",0, sink.getOutputsCount()); assertEquals("number inputs",1, sink.getInputsCount()); } @Test public void testAddParameter() { //unit with one allowed parameter UnitElement unit = new UnitElement("name", ""); //test usual adding boolean addFirst = unit.addParameter(ParameterFactory.createParameter("integer", "integer",1, "ein int")); assertTrue("add first", addFirst); //add one more than actually allowed boolean addSecond = unit.addParameter(ParameterFactory.createParameter("integer", "integer",1, "ein int")); assertTrue("add second", addSecond); } @Test public void testHasInputs() { // Sources have no inputs UnitElement source = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12)); assertFalse("source", source.hasInputs()); assertFalse("source", source.hasInputsConnected()); assertTrue(source.hasRequiredInputsConnected()); UnitElement filter = UnitFactoryExt.createAddNoiseUnit(); assertTrue("filter", filter.hasInputs()); assertFalse("filter", filter.hasInputsConnected()); assertFalse(filter.hasRequiredInputsConnected()); Connection conn1 = new Connection(source, 1, filter, 1); conn1.connect(); assertTrue(conn1.isConnected()); assertTrue("filter", filter.hasInputsConnected()); Input filter1Input1 = filter.getInput(0); assertTrue(filter1Input1.isRequired()); assertTrue(filter.hasRequiredInputsConnected()); } @Test public void testAddInput() { //unit with one allowed parameter UnitElement unit = new UnitElement("name", ""); //test usual adding Input input = new Input("input", "i", DataTypeFactory.createInteger(), unit, 4, true, false); boolean addFirst = unit.addInput(input); assertTrue("add first", addFirst); assertEquals(1, unit.getInputsCount()); //add one more Input scndInput = new Input(DataTypeFactory.createInteger(), unit, 1); boolean addSecond = unit.addInput(scndInput); assertTrue("add second", addSecond); assertEquals(2, unit.getInputsCount()); } @Test public void testAddOutput() { //unit with one allowed parameter UnitElement unit = new UnitElement("name", ""); //test usual adding Output output = new Output("Output", "i", DataTypeFactory.createInteger(),unit, 4); boolean addFirst = unit.addOutput(output); assertTrue("add first", addFirst); assertEquals(1, unit.getOutputsCount()); //add one more Output scndOutput = new Output(DataTypeFactory.createInteger(), unit, 1); boolean addSecond = unit.addOutput(scndOutput); assertTrue("add second", addSecond); assertEquals(2, unit.getOutputsCount()); } @Test public void testRequiredInputs() { //TODO } @Test public void testHasOutputs() { UnitElement sink = UnitFactoryExt.createHistogramUnit(new Point(0,0)); assertTrue("is a sink", sink.getUnitType() == Type.SINK); assertFalse(sink.hasOutputsConnected()); assertFalse(sink.hasOutputs()); assertEquals(0, sink.getOutputsCount()); UnitElement filter = UnitFactoryExt.createFindEdgesUnit(); assertTrue("is a filter", filter.getUnitType() == Type.FILTER); assertFalse(filter.hasOutputsConnected()); assertTrue(filter.hasOutputs()); assertEquals(1, filter.getOutputsCount());; } @Test public void testHasAllInputsMarked() { // test output-only UnitElement sourceUnit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12)); UnitElement sourceUnit2 = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12)); // test input/output case UnitElement filterUnit1 = UnitFactoryExt.createAddNoiseUnit(); UnitElement filterUnit2 = UnitFactoryExt.createImageCalculatorUnit(); Connection conn = new Connection(sourceUnit, 1, filterUnit1, 1); ConnectionList connList = new ConnectionList(); connList.add(conn); //assertion assertTrue("source has inputs marked", sourceUnit.hasAllInputsMarked()); // the source is not yet marked, so the first filter should give false assertFalse("filter1 has inputs marked yet", filterUnit1.hasAllInputsMarked()); assertTrue("filter1 is connected", filterUnit1.hasRequiredInputsConnected()); assertFalse("filter2 has all input marled", filterUnit2.hasAllInputsMarked()); assertFalse("filter2 is connected", filterUnit2.hasInputsConnected()); Connection conn2 = new Connection(sourceUnit, 1, filterUnit2, 1); connList.add(conn2); assertTrue("input of filter2 connected", filterUnit2.getInput(0).isConnected()); assertTrue("filter2 is connected", filterUnit2.hasInputsConnected()); assertFalse("filter2 has no inputs marked yet", filterUnit2.hasAllInputsMarked()); assertFalse("filter2 is connected", filterUnit2.hasRequiredInputsConnected()); //set mark on the source, now the filter next connected should find this mark sourceUnit.setMark(1); assertTrue("input of filter1 connected", filterUnit1.getInput(0).isConnected()); assertTrue("filter1 has all inputs marked", filterUnit1.hasAllInputsMarked()); assertFalse("filter2 has all inputs marked", filterUnit2.hasAllInputsMarked()); Connection conn3 = new Connection(sourceUnit2, 1, filterUnit2, 2); connList.add(conn3); assertFalse("filter2 has no inputs marked yet", filterUnit2.hasAllInputsMarked()); assertTrue("filter2 is connected", filterUnit2.hasRequiredInputsConnected()); sourceUnit2.setMark(2); assertTrue("filter2 has all inputs marked", filterUnit2.hasAllInputsMarked()); } @Test public void testSetMark() { // test output-only UnitElement sourceUnit = UnitFactoryExt.createBackgroundUnit(new Dimension(12, 12)); // test input/output case UnitElement filterUnit1 = UnitFactoryExt.createAddNoiseUnit(); assertTrue("mark on source before setting", sourceUnit.hasAllInputsMarked()); assertFalse("mark on filter before setting", filterUnit1.hasAllInputsMarked()); assertUnitMarks(sourceUnit, 0, true); assertUnitMarks(filterUnit1, 0, false); //set marks sourceUnit.setMark(1); filterUnit1.setMark(1); assertUnitMarks(sourceUnit, 1, true); assertUnitMarks(filterUnit1, 1, true); } /** * @param sourceUnit */ private void assertUnitMarks(UnitElement sourceUnit, int expected, boolean expectedMark) { for (Input input : sourceUnit.getInputs()) { assertEquals("mark set in "+sourceUnit+" for "+input, expected, input.getMark()); assertEquals(expectedMark, input.isMarked()); assertEquals(!expectedMark, input.isUnmarked()); } for (Output output : sourceUnit.getOutputs()) { assertEquals("mark set in "+sourceUnit+" for "+output, expected, output.getMark()); } } @Test public void testClone() { UnitElement mergeUnit = UnitFactoryExt.createImageCalculatorUnit(); UnitElement clone = mergeUnit.clone(); //assertions assertFalse("object the same", mergeUnit.equals(clone)); assertEquals("number of max inputs", mergeUnit.getInputsCount(), clone.getInputsCount()); assertEquals("number of max outputs", mergeUnit.getOutputsCount(), clone.getOutputsCount()); assertEquals("number of max parameters", mergeUnit.getParametersCount(), clone.getParametersCount()); assertEquals("unit name", mergeUnit.getUnitName(), clone.getUnitName()); assertNotSame("unit id", mergeUnit.getNodeID(), clone.getNodeID()); assertFalse("Unitid not the same",(mergeUnit.getNodeID() == clone.getNodeID())); // assert Object MacroElement mergeObject = (MacroElement) mergeUnit.getObject(); MacroElement cloneObject = (MacroElement) clone.getObject(); assertFalse("contained object", mergeObject.equals(cloneObject)); assertEquals("object imagej syntax", mergeObject.getImageJSyntax() , cloneObject.getImageJSyntax()); // assert Inputs assertEquals("inputs actual", mergeUnit.getInputsCount(), clone.getInputsCount()); for (int i = 0; i < clone.getInputsCount(); i++) { Input cloneInput = clone.getInput(i); Input mergeInput = mergeUnit.getInput(i); assertFalse("input equals", cloneInput.equals(mergeInput)); assertFalse("input parents equals", cloneInput.getParent().equals(mergeInput.getParent())); } // assert Outputs // assertEquals("outputs actual", mergeUnit.getOutputsActualCount(), clone.getOutputsActualCount()); for (int i = 0; i < clone.getOutputsCount(); i++) { Output cloneOutput = clone.getOutput(i); Output mergeOutput = mergeUnit.getOutput(i); assertFalse("output equals", cloneOutput.equals(mergeOutput)); assertFalse("output parents equals", cloneOutput.getParent().equals(mergeOutput.getParent())); } } /* * Helper methods */ protected UnitElement createSourceUnit() { UnitElement unit1 = new UnitElement("unit1", "some syntax"); Output output1 = new Output("output1", "o", DataTypeFactory.createImage(PlugInFilter.DOES_32), unit1, 1); unit1.addOutput(output1); Output output2 = new Output("output2", "o", DataTypeFactory.createImage(PlugInFilter.DOES_ALL), unit1, 2); unit1.addOutput(output2); Output output3 = new Output("output3", "o", DataTypeFactory.createImage(-1), unit1, 3); unit1.addOutput(output3); Output output4 = new Output("output4", "o", DataTypeFactory.createImage(PlugInFilter.DOES_16+PlugInFilter.DOES_32), unit1, 4); unit1.addOutput(output4); return unit1; } protected UnitElement createSinkUnit() { UnitElement unit2 = new UnitElement("unit2", "some syntax"); Input input1 = new Input("input1", "i", DataTypeFactory.createImage(PlugInFilter.DOES_32), unit2, 1, true, false); unit2.addInput(input1); Input input2 = new Input("input2", "i", DataTypeFactory.createImage(PlugInFilter.DOES_16), unit2, 1, true, false); unit2.addInput(input2); Input input3 = new Input("input3", "i", DataTypeFactory.createImage(PlugInFilter.DOES_ALL), unit2, 1, true, false); unit2.addInput(input3); Input input4 = new Input("input4", "i", DataTypeFactory.createImage(PlugInFilter.DOES_32+PlugInFilter.DOES_16), unit2, 1, true, false); unit2.addInput(input4); return unit2; } protected UnitElement createUnit(int inputImageType, int outputImageType) { UnitElement unit2 = new UnitElement("unit", "some syntax"); Output output1 = new Output("output1", "o", DataTypeFactory.createImage(outputImageType), unit2, 1); unit2.addOutput(output1); Input input1 = new Input("input1", "i", DataTypeFactory.createImage(inputImageType), unit2, 1, true, false); unit2.addInput(input1); return unit2; } }