package test.svg.loadSave;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.junit.Test;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import net.sf.latexdraw.view.svg.IShapeSVGFactory;
import net.sf.latexdraw.view.svg.SVGShapesFactory;
import net.sf.latexdraw.models.ShapeFactory;
import net.sf.latexdraw.models.interfaces.shape.FillingStyle;
import net.sf.latexdraw.models.interfaces.shape.IDrawing;
import net.sf.latexdraw.models.interfaces.shape.IGroup;
import net.sf.latexdraw.models.interfaces.shape.IShape;
import net.sf.latexdraw.models.interfaces.shape.LineStyle;
import net.sf.latexdraw.view.latex.DviPsColors;
import net.sf.latexdraw.parsers.svg.SVGAttributes;
import net.sf.latexdraw.parsers.svg.SVGDefsElement;
import net.sf.latexdraw.parsers.svg.SVGDocument;
import net.sf.latexdraw.parsers.svg.SVGElement;
import net.sf.latexdraw.parsers.svg.SVGGElement;
import net.sf.latexdraw.parsers.svg.SVGSVGElement;
import net.sf.latexdraw.util.LNamespace;
public abstract class TestLoadSaveSVG<T extends IShape> {
protected T shape;
public T saveLoadShape(T sh) {
IDrawing drawing = ShapeFactory.INST.createDrawing();
drawing.addShape(sh);
SVGDocument doc = toSVG(drawing);
return toLatexdraw(doc);
}
@SuppressWarnings("unchecked")
protected T toLatexdraw(final SVGDocument doc) {
final IGroup shapes = ShapeFactory.INST.createGroup();
final NodeList elts = doc.getDocumentElement().getChildNodes();
Node node;
for(int i = 0, size = elts.getLength(); i < size; i++) {
node = elts.item(i);
if(node instanceof SVGElement)
shapes.addShape(IShapeSVGFactory.INSTANCE.createShape((SVGElement)node));
}
return (T)(shapes.size() == 1?shapes.getShapeAt(0):shapes.size() == 0?null:shapes);
}
protected SVGDocument toSVG(final IDrawing drawing) {
// Creation of the SVG document.
final List<IShape> shapes = drawing.getShapes();
final SVGDocument doc = new SVGDocument();
final SVGSVGElement root = doc.getFirstChild();
final SVGGElement g = new SVGGElement(doc);
final SVGDefsElement defs = new SVGDefsElement(doc);
SVGElement elt;
root.appendChild(defs);
root.appendChild(g);
root.setAttribute("xmlns:" + LNamespace.LATEXDRAW_NAMESPACE, LNamespace.LATEXDRAW_NAMESPACE_URI);//$NON-NLS-1$
for(final IShape sh : shapes)
if(sh != null) {
// For each shape an SVG element is created.
elt = SVGShapesFactory.INSTANCE.createSVGElement(sh, doc);
if(elt != null)
g.appendChild(elt);
}
// Setting SVG attributes to the created document.
root.setAttribute(SVGAttributes.SVG_VERSION, "1.1");//$NON-NLS-1$
// root.setAttribute(SVGAttributes.SVG_BASE_PROFILE, "full");//$NON-NLS-1$
return doc;
}
protected T generateShape() {
final T sh = saveLoadShape(shape);
assertNotNull(sh);
assertEquals(sh.getClass(), shape.getClass());
return sh;
}
protected void compareShapes(final T sh2) {
if(shape.isShowPtsable()) {
assertEquals(shape.isShowPts(), sh2.isShowPts());
}
if(shape.isThicknessable()) {
assertEquals(shape.getThickness(), sh2.getThickness(), 0.0001);
}
if(shape.isLineStylable()) {
assertEquals(shape.getLineStyle(), sh2.getLineStyle());
assertEquals(shape.getLineColour(), sh2.getLineColour());
switch(shape.getLineStyle()) {
case DASHED:
assertEquals(shape.getDashSepBlack(), sh2.getDashSepBlack(), 0.0001);
assertEquals(shape.getDashSepWhite(), sh2.getDashSepWhite(), 0.0001);
break;
case DOTTED:
assertEquals(shape.getDotSep(), sh2.getDotSep(), 0.0001);
break;
default:
}
}
if(shape.isShadowable()) {
assertEquals(shape.hasShadow(), sh2.hasShadow());
assertEquals(shape.getShadowAngle(), sh2.getShadowAngle(), 0.0001);
assertEquals(shape.getShadowCol(), sh2.getShadowCol());
assertEquals(shape.getShadowSize(), sh2.getShadowSize(), 0.0001);
}
if(shape.isDbleBorderable()) {
assertEquals(shape.hasDbleBord(), sh2.hasDbleBord());
assertEquals(shape.getDbleBordCol(), sh2.getDbleBordCol());
assertEquals(shape.getDbleBordSep(), sh2.getDbleBordSep(), 0.0001);
}
if(shape.isInteriorStylable()) {
assertEquals(shape.getFillingStyle(), sh2.getFillingStyle());
assertEquals(shape.isFilled(), sh2.isFilled());
assertEquals(shape.getFillingCol(), sh2.getFillingCol());
if(shape.getFillingStyle().isHatchings()) {
assertEquals(shape.getHatchingsAngle(), sh2.getHatchingsAngle(), 0.0001);
assertEquals(shape.getHatchingsCol(), sh2.getHatchingsCol());
assertEquals(shape.getHatchingsSep(), sh2.getHatchingsSep(), 0.0001);
assertEquals(shape.getHatchingsWidth(), sh2.getHatchingsWidth(), 0.0001);
}else if(shape.getFillingStyle().isGradient()) {
assertEquals(shape.getGradAngle(), sh2.getGradAngle(), 0.0001);
assertEquals(shape.getGradMidPt(), sh2.getGradMidPt(), 0.0001);
assertEquals(shape.getGradColEnd(), sh2.getGradColEnd());
assertEquals(shape.getGradColStart(), sh2.getGradColStart());
}
}
}
@Test
public void testShowPoints() {
if(shape.isShowPtsable()) {
setDefaultDimensions();
shape.setShowPts(true);
compareShapes(generateShape());
}
}
@Test
public void testShadow() {
if(shape.isShadowable()) {
setDefaultDimensions();
shape.setFillingStyle(FillingStyle.PLAIN);// Must fill the shape before.
shape.setHasShadow(true);
shape.setShadowAngle(-1);
shape.setShadowCol(DviPsColors.RED);
shape.setShadowSize(11.2);
compareShapes(generateShape());
}
}
@Test
public void testDoubleBorders() {
if(shape.isDbleBorderable()) {
setDefaultDimensions();
shape.setHasDbleBord(true);
shape.setDbleBordCol(DviPsColors.GREEN);
shape.setDbleBordSep(3.);
compareShapes(generateShape());
}
}
@Test
public void testDoubleBordersWithShadow() {
if(shape.isShadowable() && shape.isDbleBorderable()) {
setDefaultDimensions();
shape.setFillingStyle(FillingStyle.PLAIN);// Must fill the shape before.
shape.setHasDbleBord(true);
shape.setDbleBordCol(DviPsColors.GREEN);
shape.setDbleBordSep(3.);
shape.setHasShadow(true);
shape.setShadowAngle(-1);
shape.setShadowCol(DviPsColors.RED);
shape.setShadowSize(11.2);
compareShapes(generateShape());
}
}
@Test
public void testBorderStyle() {
if(shape.isLineStylable()) {
shape.setLineStyle(LineStyle.DASHED);
shape.setThickness(10);
shape.setLineColour(DviPsColors.YELLOW);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsPLAIN() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.PLAIN);
shape.setHatchingsCol(DviPsColors.GRAY);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsVLINESPLAIN() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.VLINES_PLAIN);
shape.setHatchingsAngle(1.2);
shape.setHatchingsCol(DviPsColors.GRAY);
shape.setHatchingsSep(3.12);
shape.setHatchingsWidth(123.3);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsVLINES() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.VLINES);
shape.setHatchingsAngle(1.2);
shape.setHatchingsCol(DviPsColors.GRAY);
shape.setHatchingsSep(3.12);
shape.setHatchingsWidth(123.3);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsHLINESPLAIN() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.HLINES_PLAIN);
shape.setHatchingsAngle(1.2);
shape.setHatchingsCol(DviPsColors.GRAY);
shape.setHatchingsSep(3.12);
shape.setHatchingsWidth(123.3);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsHLINES() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.HLINES);
shape.setHatchingsAngle(1.2);
shape.setHatchingsCol(DviPsColors.GRAY);
shape.setHatchingsSep(3.12);
shape.setHatchingsWidth(123.3);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsCLINESPLAIN() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.CLINES_PLAIN);
shape.setHatchingsAngle(1.2);
shape.setFillingCol(DviPsColors.LIGHTGRAY);
shape.setHatchingsCol(DviPsColors.GRAY);
shape.setHatchingsSep(3.12);
shape.setHatchingsWidth(123.3);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingHatchingsCLINES() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.CLINES);
shape.setHatchingsAngle(1.2);
shape.setHatchingsCol(DviPsColors.GRAY);
shape.setHatchingsSep(3.12);
shape.setHatchingsWidth(123.3);
setDefaultDimensions();
compareShapes(generateShape());
}
}
@Test
public void testFillingGradient() {
if(shape.isInteriorStylable()) {
shape.setFillingStyle(FillingStyle.GRAD);
shape.setGradAngle(0.2);
shape.setGradColEnd(DviPsColors.BLUE);
shape.setGradColStart(DviPsColors.CYAN);
shape.setGradMidPt(0.1);
setDefaultDimensions();
compareShapes(generateShape());
}
}
protected abstract void setDefaultDimensions();
}