1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-12-22 19:09:03 +00:00

Add a first test using Debug format output

This commit is contained in:
Arnaud Roques 2021-03-21 13:52:20 +01:00
parent 9048552ecb
commit bdc0eb9709
8 changed files with 435 additions and 8 deletions

View File

@ -80,7 +80,8 @@ public enum FileFormat {
LATEX_NO_PREAMBLE("application/x-latex"),
BASE64("text/plain; charset=x-user-defined"),
BRAILLE_PNG("image/png"),
PREPROC("text/plain");
PREPROC("text/plain"),
DEBUG("text/plain");
private final String mimeType;

View File

@ -65,6 +65,10 @@ public class FontConfiguration {
private final boolean useUnderlineForHyperlink;
private final int tabSize;
public String toStringDebug() {
return getFont().toStringDebug() + " " + styles.toString();
}
public FontConfiguration(UFont font, HColor color, HColor hyperlinkColor, boolean useUnderlineForHyperlink) {
this(font, color, hyperlinkColor, useUnderlineForHyperlink, 8);
}

View File

@ -79,6 +79,7 @@ import net.sourceforge.plantuml.ugraphic.color.HColorGradient;
import net.sourceforge.plantuml.ugraphic.color.HColorSimple;
import net.sourceforge.plantuml.ugraphic.color.HColorUtils;
import net.sourceforge.plantuml.ugraphic.crossing.UGraphicCrossing;
import net.sourceforge.plantuml.ugraphic.debug.UGraphicDebug;
import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps;
import net.sourceforge.plantuml.ugraphic.g2d.UGraphicG2d;
import net.sourceforge.plantuml.ugraphic.hand.UGraphicHandwritten;
@ -281,17 +282,16 @@ public class ImageBuilder {
private UGraphic2 createUGraphic(FileFormatOption option, long seed, final Dimension2D dim, Animation animationArg,
double dx, double dy) {
final ColorMapper colorMapper = param.getColorMapper();
final double scaleFactor = (param.getScale() == null ? 1 : param.getScale().getScale(dim.getWidth(), dim.getHeight()))
* param.getDpi() / 96.0;
final double scaleFactor = (param.getScale() == null ? 1
: param.getScale().getScale(dim.getWidth(), dim.getHeight())) * param.getDpi() / 96.0;
final FileFormat fileFormat = option.getFileFormat();
switch (fileFormat) {
case PNG:
return createUGraphicPNG(colorMapper, scaleFactor, dim, param.getBackcolor(), animationArg, dx, dy,
option.getWatermark());
case SVG:
return createUGraphicSVG(colorMapper, scaleFactor, dim, param.getBackcolor(),
option.getSvgLinkTarget(), option.getHoverColor(), seed, option.getPreserveAspectRatio(),
param.getlengthAdjust());
return createUGraphicSVG(colorMapper, scaleFactor, dim, param.getBackcolor(), option.getSvgLinkTarget(),
option.getHoverColor(), seed, option.getPreserveAspectRatio(), param.getlengthAdjust());
case EPS:
return new UGraphicEps(colorMapper, EpsStrategy.getDefault2());
case EPS_TEXT:
@ -309,13 +309,16 @@ public class ImageBuilder {
case UTXT:
case ATXT:
return new UGraphicTxt();
case DEBUG:
return new UGraphicDebug();
default:
throw new UnsupportedOperationException(fileFormat.toString());
}
}
private UGraphic2 createUGraphicSVG(ColorMapper colorMapper, double scaleFactor, Dimension2D dim, final HColor suggested,
String svgLinkTarget, String hover, long seed, String preserveAspectRatio, LengthAdjust lengthAdjust) {
private UGraphic2 createUGraphicSVG(ColorMapper colorMapper, double scaleFactor, Dimension2D dim,
final HColor suggested, String svgLinkTarget, String hover, long seed, String preserveAspectRatio,
LengthAdjust lengthAdjust) {
HColor backColor = HColorUtils.WHITE;
if (suggested instanceof HColorSimple) {
backColor = suggested;

View File

@ -62,6 +62,14 @@ public class UFont {
}
}
public String toStringDebug() {
final StringBuilder sb = new StringBuilder();
sb.append(font.getFontName());
sb.append("/");
sb.append(font.getSize());
return sb.toString();
}
public UFont(String fontFamily, int fontStyle, int fontSize) {
this(buildFont(fontFamily, fontStyle, fontSize), fontFamily);
}

View File

@ -92,4 +92,8 @@ public class HColorSimple extends HColorAbstract implements HColor {
return diffRed * .3 + diffGreen * .59 + diffBlue * .11;
}
public final boolean isMonochrome() {
return monochrome;
}
}

View File

@ -0,0 +1,52 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*/
package net.sourceforge.plantuml.ugraphic.debug;
import java.awt.geom.Dimension2D;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.ugraphic.UFont;
public class StringBounderDebug implements StringBounder {
public Dimension2D calculateDimension(UFont font, String text) {
final double size = font.getSize2D();
final double height = size;
final double width = size * text.length();
return new Dimension2DDouble(width, height);
}
}

View File

@ -0,0 +1,187 @@
/* ========================================================================
* PlantUML : a free UML diagram generator
* ========================================================================
*
* (C) Copyright 2009-2020, Arnaud Roques
*
* Project Info: http://plantuml.com
*
* If you like this project or if you find it useful, you can support us at:
*
* http://plantuml.com/patreon (only 1$ per month!)
* http://plantuml.com/paypal
*
* This file is part of PlantUML.
*
* PlantUML is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PlantUML distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
*
* Original Author: Arnaud Roques
*
*/
package net.sourceforge.plantuml.ugraphic.debug;
import java.awt.Color;
import java.awt.geom.Point2D;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.ugraphic.AbstractCommonUGraphic;
import net.sourceforge.plantuml.ugraphic.ClipContainer;
import net.sourceforge.plantuml.ugraphic.UGraphic2;
import net.sourceforge.plantuml.ugraphic.ULine;
import net.sourceforge.plantuml.ugraphic.UPolygon;
import net.sourceforge.plantuml.ugraphic.URectangle;
import net.sourceforge.plantuml.ugraphic.UShape;
import net.sourceforge.plantuml.ugraphic.UText;
import net.sourceforge.plantuml.ugraphic.color.ColorMapperIdentity;
import net.sourceforge.plantuml.ugraphic.color.HColor;
import net.sourceforge.plantuml.ugraphic.color.HColorSimple;
public class UGraphicDebug extends AbstractCommonUGraphic implements ClipContainer, UGraphic2 {
private final List<String> output;
@Override
protected AbstractCommonUGraphic copyUGraphic() {
return new UGraphicDebug(this, output);
}
private UGraphicDebug(UGraphicDebug other, List<String> output) {
super(other);
this.output = output;
}
public UGraphicDebug() {
super(new ColorMapperIdentity());
this.output = new ArrayList<String>();
}
public StringBounder getStringBounder() {
return new StringBounderDebug();
}
public void draw(UShape shape) {
final int dx = (int) getTranslateX();
final int dy = (int) getTranslateY();
if (shape instanceof ULine) {
outLine((ULine) shape);
} else if (shape instanceof URectangle) {
outRectangle((URectangle) shape);
} else if (shape instanceof UText) {
outText((UText) shape);
} else if (shape instanceof UPolygon) {
outPolygon((UPolygon) shape);
} else {
output.add("DEBUG " + shape.getClass().getSimpleName() + " " + dx + " " + dy);
output.add("");
}
}
private void outPolygon(UPolygon shape) {
output.add("POLYGON:");
output.add(" points:");
for (Point2D pt : shape.getPoints()) {
final double xp = getTranslateX() + pt.getX();
final double yp = getTranslateY() + pt.getY();
output.add(" - " + pointd(xp, yp));
}
output.add(" stroke: " + getParam().getStroke());
output.add(" shadow: " + (int) shape.getDeltaShadow());
output.add(" color: " + colorToString(getParam().getColor()));
output.add(" backcolor: " + colorToString(getParam().getBackcolor()));
output.add("");
}
private void outText(UText shape) {
output.add("TEXT:");
output.add(" text: " + shape.getText());
output.add(" position: " + pointd(getTranslateX(), getTranslateY()));
output.add(" orientation: " + shape.getOrientation());
output.add(" font: " + shape.getFontConfiguration().toStringDebug());
output.add(" color: " + colorToString(getParam().getColor()));
output.add("");
}
private void outRectangle(URectangle shape) {
output.add("RECTANGLE:");
output.add(" pt1: " + pointd(getTranslateX(), getTranslateY()));
output.add(" pt2: " + pointd(getTranslateX() + shape.getWidth(), getTranslateY() + shape.getHeight()));
output.add(" xCorner: " + (int) shape.getRx());
output.add(" yCorner: " + (int) shape.getRy());
output.add(" stroke: " + getParam().getStroke());
output.add(" shadow: " + (int) shape.getDeltaShadow());
output.add(" color: " + colorToString(getParam().getColor()));
output.add(" backcolor: " + colorToString(getParam().getBackcolor()));
output.add("");
}
private void outLine(ULine shape) {
output.add("LINE:");
output.add(" pt1: " + pointd(getTranslateX(), getTranslateY()));
output.add(" pt2: " + pointd(getTranslateX() + shape.getDX(), getTranslateY() + shape.getDY()));
output.add(" stroke: " + getParam().getStroke());
output.add(" shadow: " + (int) shape.getDeltaShadow());
output.add(" color: " + colorToString(getParam().getColor()));
output.add("");
}
private String point(int x, int y) {
return "" + x + ";" + y;
}
private String pointd(double x, double y) {
return point((int) x, (int) y);
}
private String colorToString(HColor color) {
if (color instanceof HColorSimple) {
final HColorSimple simple = (HColorSimple) color;
final Color internal = simple.getColor999();
if (simple.isMonochrome()) {
return "monochrome " + Integer.toHexString(internal.getRGB());
}
return Integer.toHexString(internal.getRGB());
}
return color.getClass().getSimpleName();
}
public void writeImageTOBEMOVED(OutputStream os, String metadata, int dpi) throws IOException {
print(os, "DPI: " + dpi);
print(os, "");
for (String s : output) {
print(os, s);
}
os.flush();
}
private void print(OutputStream os, String out) throws UnsupportedEncodingException, IOException {
os.write(out.getBytes("UTF-8"));
os.write("\n".getBytes("UTF-8"));
}
}

View File

@ -0,0 +1,168 @@
package demo1;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.junit.jupiter.api.Test;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.DiagramDescription;
/*
* This test is a simple POC of what could be non-regression test for PlantUML.
*
* In real world, test diagram and expected result would not be stored in source file.
*/
class SimpleSequenceDiagramTest {
@Test
void testSimple() throws IOException {
final String diagramText = getText();
final SourceStringReader ssr = new SourceStringReader(diagramText, "UTF-8");
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final DiagramDescription diagramDescription = ssr.outputImage(baos, 0, new FileFormatOption(FileFormat.DEBUG));
assertEquals("(2 participants)", diagramDescription.getDescription());
final String desc = new String(baos.toByteArray(), "UTF-8");
final String expected = getExpectedResult();
assertEquals(expected, desc);
}
private String getText() {
return packString( //
"@startuml", //
"Alice -> Bob : Hello", //
"@enduml");
}
private String getExpectedResult() {
return packString( //
"DPI: 96", //
"", //
"LINE:", //
" pt1: 29;41", //
" pt2: 29;91", //
" stroke: 5.0-5.0-1.0", //
" shadow: 0", //
" color: ffa80036", //
"", //
"LINE:", //
" pt1: 84;41", //
" pt2: 84;91", //
" stroke: 5.0-5.0-1.0", //
" shadow: 0", //
" color: ffa80036", //
"", //
"RECTANGLE:", //
" pt1: 5;5", //
" pt2: 49;36", //
" xCorner: 0", //
" yCorner: 0", //
" stroke: 0.0-0.0-1.5", //
" shadow: 4", //
" color: ffa80036", //
" backcolor: fffefece", //
"", //
"TEXT:", //
" text: Alice", //
" position: 12;22", //
" orientation: 0", //
" font: SansSerif.plain/14 []", //
" color: ffa80036", //
"", //
"RECTANGLE:", //
" pt1: 5;90", //
" pt2: 49;122", //
" xCorner: 0", //
" yCorner: 0", //
" stroke: 0.0-0.0-1.5", //
" shadow: 4", //
" color: ffa80036", //
" backcolor: fffefece", //
"", //
"TEXT:", //
" text: Alice", //
" position: 12;108", //
" orientation: 0", //
" font: SansSerif.plain/14 []", //
" color: ffa80036", //
"", //
"RECTANGLE:", //
" pt1: 63;5", //
" pt2: 102;36", //
" xCorner: 0", //
" yCorner: 0", //
" stroke: 0.0-0.0-1.5", //
" shadow: 4", //
" color: ffa80036", //
" backcolor: fffefece", //
"", //
"TEXT:", //
" text: Bob", //
" position: 70;22", //
" orientation: 0", //
" font: SansSerif.plain/14 []", //
" color: ffa80036", //
"", //
"RECTANGLE:", //
" pt1: 63;90", //
" pt2: 102;122", //
" xCorner: 0", //
" yCorner: 0", //
" stroke: 0.0-0.0-1.5", //
" shadow: 4", //
" color: ffa80036", //
" backcolor: fffefece", //
"", //
"TEXT:", //
" text: Bob", //
" position: 70;108", //
" orientation: 0", //
" font: SansSerif.plain/14 []", //
" color: ffa80036", //
"", //
"POLYGON:", //
" points:", //
" - 72;69", //
" - 82;73", //
" - 72;77", //
" - 76;73", //
" stroke: 0.0-0.0-1.0", //
" shadow: 0", //
" color: ffa80036", //
" backcolor: ffa80036", //
"", //
"LINE:", //
" pt1: 29;73", //
" pt2: 78;73", //
" stroke: 0.0-0.0-1.0", //
" shadow: 0", //
" color: ffa80036", //
"", //
"TEXT:", //
" text: Hello", //
" position: 36;65", //
" orientation: 0", //
" font: SansSerif.plain/13 []", //
" color: ffa80036");
}
private String packString(String... list) {
final StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
sb.append("\n");
}
return sb.toString() + "\n";
}
}