From 97ba32e5aeee2141a7230e70e1e4a34288847c00 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 29 Jun 2017 14:18:29 +0200
Subject: [PATCH] unit test for drawing simple model

---
 .../graphics/AbstractImageGenerator.java      |  16 +--
 .../converter/graphics/JpgImageGenerator.java |   4 +
 .../converter/graphics/PdfImageGenerator.java |   4 +
 .../converter/graphics/PngImageGenerator.java |   4 +
 .../converter/graphics/SvgImageGenerator.java |   4 +
 .../bioEntity/BioEntityConverter.java         |   6 +-
 .../bioEntity/BioEntityConverterImpl.java     |  10 +-
 .../compartment/CompartmentConverter.java     |   3 +-
 .../element/species/SpeciesConverter.java     |   3 +-
 .../graphics/AbstractImageGeneratorTest.java  | 114 ++++++++++++++++++
 .../converter/graphics/AllGraphicsTests.java  |   1 +
 .../graphics/GraphicsTestFunctions.java       |  21 ++++
 .../reaction/ReactionConverterTest.java       |  14 +--
 .../editor/gui/canvas/MinervaCanvas.java      |   4 +
 14 files changed, 181 insertions(+), 27 deletions(-)
 create mode 100644 converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java
 create mode 100644 converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java

diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java
index 0eb5e5f863..afd349aacb 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java
@@ -700,9 +700,12 @@ public abstract class AbstractImageGenerator {
 		for (Layer layer : params.getModel().getLayers()) {
 			drawLayer(layer);
 		}
+		closeImageObject();
 		setDrawn(true);
 	}
 
+	protected abstract void closeImageObject();
+
 	/**
 	 * This method draw layer on the graphics.
 	 * 
@@ -840,13 +843,9 @@ public abstract class AbstractImageGenerator {
 		if (rescale) {
 			customScale = scale;
 		}
-		try {
-			converter.draw(
-					species, graphics, new ConverterParams().scale(customScale).textCentered(rescale).level(level).sbgnFormat(sbgnFormat).nested(params.nested),
-					visibleLayouts);
-		} catch (Exception e) {
-			throw new DrawingException(eu.getElementTag(species) + "Problem with drawing element.", e);
-		}
+		converter.draw(
+				species, graphics, new ConverterParams().scale(customScale).textCentered(rescale).level(level).sbgnFormat(sbgnFormat).nested(params.nested),
+				visibleLayouts);
 
 		// if the species is a complex then we may want to draw children
 		// objects
@@ -874,8 +873,9 @@ public abstract class AbstractImageGenerator {
 	 *          list of {@link ColorSchema} used for coloring reaction in layouts
 	 * @param params
 	 *          list of all params to create apropriate image
+	 * @throws DrawingException
 	 */
-	protected void drawReaction(final Reaction reaction, List<ColorSchema> visibleLayouts, Params params) {
+	protected void drawReaction(final Reaction reaction, List<ColorSchema> visibleLayouts, Params params) throws DrawingException {
 		if (!cross(reaction.getLines())) {
 			return;
 		}
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java
index 142bb59baf..c903920061 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java
@@ -77,4 +77,8 @@ public class JpgImageGenerator extends NormalImageGenerator {
 		return "jpg";
 	}
 
+	@Override
+	protected void closeImageObject() {
+	}
+
 }
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java
index 61091747ec..504b4e2d1c 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java
@@ -74,6 +74,10 @@ public class PdfImageGenerator extends AbstractImageGenerator {
 	 */
 	public PdfImageGenerator(final Params params) throws DrawingException {
 		super(params);
+	}
+
+	@Override
+	protected void closeImageObject() {
 		getGraphics().dispose();
 		pdfDocument.close();
 	}
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java
index 50729fb7b5..77f65da695 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java
@@ -43,6 +43,10 @@ public class PngImageGenerator extends NormalImageGenerator {
 		super(params);
 	}
 
+	@Override
+	protected void closeImageObject() {
+	}
+
 	@Override
 	public void saveToFileImplementation(String fileName) throws IOException {
 		FileOutputStream fos = new FileOutputStream(new File(fileName));
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java
index ff95faa79d..bf97fec4fd 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java
@@ -57,6 +57,10 @@ public class SvgImageGenerator extends AbstractImageGenerator {
 		super(params);
 	}
 
+	@Override
+	protected void closeImageObject() {
+	}
+
 	@Override
 	public void saveToOutputStreamImplementation(OutputStream os) throws IOException {
 		((SVGGraphics2D) getGraphics()).stream(new OutputStreamWriter(os));
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java
index 9575da4d80..2bf39b74d6 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java
@@ -60,9 +60,10 @@ public abstract class BioEntityConverter<T extends BioEntity> {
 	 *          visuzalization params (like, should the object be filled with
 	 *          solid color, etc.), for more information see
 	 *          {@link ConverterParams}
+	 * @throws DrawingException 
 	 * 
 	 */
-	public void draw(T bioEntity, Graphics2D graphics, ConverterParams params) {
+	public void draw(T bioEntity, Graphics2D graphics, ConverterParams params) throws DrawingException {
 		draw(bioEntity, graphics, params, new ArrayList<>());
 	}
 
@@ -81,9 +82,10 @@ public abstract class BioEntityConverter<T extends BioEntity> {
 	 *          list of {@link ColorSchema} that were used for visualizing this
 	 *          bioentity in different data overlays that should be overlayed on
 	 *          the alias
+	 * @throws DrawingException 
 	 * 
 	 */
-	public abstract void draw(T bioEntity, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedOverlaysColorSchemas);
+	public abstract void draw(T bioEntity, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedOverlaysColorSchemas) throws DrawingException;
 
 	/**
 	 * This function will find proper font size to display text within it. Then it
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java
index 6f71c865dc..ee41d7e572 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java
@@ -189,9 +189,13 @@ public class BioEntityConverterImpl extends BioEntityConverter<BioEntity> {
 
 	@SuppressWarnings("unchecked")
 	@Override
-	public void draw(BioEntity element, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) {
-		if (isVisible(element, params)) {
-			elementConverter.draw(element, graphics, params, visualizedLayoutsColorSchemas);
+	public void draw(BioEntity element, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) throws DrawingException {
+		try {
+			if (isVisible(element, params)) {
+				elementConverter.draw(element, graphics, params, visualizedLayoutsColorSchemas);
+			}
+		} catch (Exception e) {
+			throw new DrawingException(new ElementUtils().getElementTag(element) + "Problem with drawing element.", e);
 		}
 	}
 
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java
index b3291603ac..7e3a88ad40 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java
@@ -15,6 +15,7 @@ import lcsb.mapviewer.common.exception.InvalidArgumentException;
 import lcsb.mapviewer.common.geometry.EllipseTransformation;
 import lcsb.mapviewer.common.geometry.LineTransformation;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
+import lcsb.mapviewer.converter.graphics.DrawingException;
 import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter;
 import lcsb.mapviewer.converter.graphics.geometry.FontFinder;
 import lcsb.mapviewer.converter.graphics.geometry.RectangleTooSmallException;
@@ -179,7 +180,7 @@ public abstract class CompartmentConverter<T extends Compartment> extends Elemen
 	}
 
 	@Override
-	public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) {
+	public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) throws DrawingException {
 		draw(alias, graphics, params);
 
 		Color oldColor = graphics.getColor();
diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java
index 82edaed71d..fb2460619f 100644
--- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java
+++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java
@@ -22,6 +22,7 @@ import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.common.geometry.EllipseTransformation;
 import lcsb.mapviewer.common.geometry.LineTransformation;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
+import lcsb.mapviewer.converter.graphics.DrawingException;
 import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter;
 import lcsb.mapviewer.model.graphics.LineType;
 import lcsb.mapviewer.model.map.layout.ColorSchema;
@@ -579,7 +580,7 @@ public abstract class SpeciesConverter<T extends Species> extends ElementConvert
 	}
 
 	@Override
-	public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) {
+	public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) throws DrawingException {
 		draw(alias, graphics, params);
 
 		Color oldColor = graphics.getColor();
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java
new file mode 100644
index 0000000000..d061d78bbb
--- /dev/null
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java
@@ -0,0 +1,114 @@
+package lcsb.mapviewer.converter.graphics;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import java.awt.Graphics2D;
+import java.awt.geom.Point2D;
+
+import org.apache.log4j.Logger;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import lcsb.mapviewer.model.graphics.PolylineData;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.model.map.model.ModelFullIndexed;
+import lcsb.mapviewer.model.map.modifier.Catalysis;
+import lcsb.mapviewer.model.map.reaction.Modifier;
+import lcsb.mapviewer.model.map.reaction.Product;
+import lcsb.mapviewer.model.map.reaction.Reactant;
+import lcsb.mapviewer.model.map.reaction.Reaction;
+import lcsb.mapviewer.model.map.species.GenericProtein;
+
+public class AbstractImageGeneratorTest extends GraphicsTestFunctions {
+	Logger logger = Logger.getLogger(AbstractImageGeneratorTest.class);
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	@Before
+	public void setUp() throws Exception {
+	}
+
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void testDrawSimpleMap() throws Exception {
+		try {
+			Graphics2D graphics = createGraphicsMock();
+
+			Model model = createSimpleModel();
+
+			AbstractImageGenerator gen = createAbstractImageGeneratorMock(graphics, model);
+			gen.draw();
+
+			//3 times for proteins and 4 times for reaction
+			verify(graphics, times(7)).draw(any());
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
+	private Model createSimpleModel() {
+		Model model = new ModelFullIndexed(null);
+		model.setWidth(100);
+		model.setHeight(100);
+
+		GenericProtein protein1 = new GenericProtein("s1");
+		protein1.setX(10);
+		protein1.setY(10);
+		protein1.setWidth(10);
+		protein1.setHeight(10);
+		model.addElement(protein1);
+
+		GenericProtein protein2 = new GenericProtein("s2");
+		protein2.setX(30);
+		protein2.setY(10);
+		protein2.setWidth(10);
+		protein2.setHeight(10);
+		model.addElement(protein2);
+
+		GenericProtein protein3 = new GenericProtein("s3");
+		protein3.setX(40);
+		protein3.setY(10);
+		protein3.setWidth(10);
+		protein3.setHeight(10);
+		model.addElement(protein3);
+
+		Reaction reaction = new Reaction();
+
+		Modifier modifier = new Catalysis(protein1);
+		modifier.setLine(new PolylineData(new Point2D.Double(100, 20), new Point2D.Double(100, 80)));
+		modifier.getLine().setWidth(1.0);
+
+		Reactant reactant = new Reactant(protein2);
+		reactant.setLine(new PolylineData(new Point2D.Double(90, 90), new Point2D.Double(10, 90)));
+		reactant.getLine().setWidth(1.0);
+		Product product = new Product(protein3);
+		product.setLine(new PolylineData(new Point2D.Double(200, 90), new Point2D.Double(110, 90)));
+		product.getLine().setWidth(1.0);
+		reaction.addModifier(modifier);
+		reaction.addProduct(product);
+		reaction.addReactant(reactant);
+
+		model.addReaction(reaction);
+
+		return model;
+	}
+
+	private AbstractImageGenerator createAbstractImageGeneratorMock(Graphics2D graphics, Model model) throws Exception {
+		AbstractImageGenerator result = Mockito.mock(AbstractImageGenerator.class, Mockito.CALLS_REAL_METHODS);
+		result.setGraphics(graphics);
+		result.setParams(new AbstractImageGenerator.Params().model(model));
+		return result;
+
+	}
+
+}
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java
index 712c9d780c..582a1ddc39 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java
@@ -10,6 +10,7 @@ import lcsb.mapviewer.converter.graphics.placefinder.AllPlaceFinderTest;
 
 @RunWith(Suite.class)
 @SuiteClasses({ //
+		AbstractImageGeneratorTest.class, //
 		AllBioEntityTests.class, //
 		AllGeometryTests.class, //
 		AllPlaceFinderTest.class, //
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java
new file mode 100644
index 0000000000..4cea69b99b
--- /dev/null
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java
@@ -0,0 +1,21 @@
+package lcsb.mapviewer.converter.graphics;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+
+import org.mockito.Mockito;
+
+public abstract class GraphicsTestFunctions {
+	protected Graphics2D createGraphicsMock() {
+		Graphics2D graphics = Mockito.mock(Graphics2D.class);
+		FontMetrics fontMetrics = Mockito.mock(FontMetrics.class);
+		when(fontMetrics.getStringBounds(any(), any())).thenReturn(new Rectangle2D.Double());
+		when(graphics.getFontMetrics()).thenReturn(fontMetrics);
+		return graphics;
+	}
+
+}
diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java
index 2606bb7c83..f5f2408841 100644
--- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java
+++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java
@@ -4,14 +4,11 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
 
 import java.awt.Color;
-import java.awt.FontMetrics;
 import java.awt.Graphics2D;
 import java.awt.geom.GeneralPath;
 import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -27,6 +24,7 @@ import org.mockito.Mockito;
 
 import lcsb.mapviewer.commands.ColorExtractor;
 import lcsb.mapviewer.converter.graphics.ConverterParams;
+import lcsb.mapviewer.converter.graphics.GraphicsTestFunctions;
 import lcsb.mapviewer.model.graphics.PolylineData;
 import lcsb.mapviewer.model.map.layout.ColorSchema;
 import lcsb.mapviewer.model.map.layout.GenericColorSchema;
@@ -40,7 +38,7 @@ import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.reaction.SplitOperator;
 import lcsb.mapviewer.model.map.species.GenericProtein;
 
-public class ReactionConverterTest {
+public class ReactionConverterTest extends GraphicsTestFunctions {
 
 	ColorExtractor colorExtractor = new ColorExtractor(Color.RED, Color.GREEN);
 
@@ -359,14 +357,6 @@ public class ReactionConverterTest {
 		}
 	}
 
-	private Graphics2D createGraphicsMock() {
-		Graphics2D graphics = Mockito.mock(Graphics2D.class);
-		FontMetrics fontMetrics = Mockito.mock(FontMetrics.class);
-		when(fontMetrics.getStringBounds(any(), any())).thenReturn(new Rectangle2D.Double());
-		when(graphics.getFontMetrics()).thenReturn(fontMetrics);
-		return graphics;
-	}
-
 	@Test
 	public void testDrawComplexReactionWithSemanticZoomingAndReactantOff() throws Exception {
 		try {
diff --git a/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java b/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java
index 454cdb3aff..7190343e89 100644
--- a/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java
+++ b/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java
@@ -409,6 +409,10 @@ public class MinervaCanvas extends JComponent {
 					throw new NotImplementedException();
 				}
 
+				@Override
+				protected void closeImageObject() {
+				}
+
 			}
 			try {
 				if (lastBufferedData == null || Math.abs(lastBufferedData.getZoom() - zoom) > Configuration.EPSILON) {
-- 
GitLab