package org.joshy.sketch.actions.io;
import com.joshondesign.xml.Doc;
import com.joshondesign.xml.Elem;
import com.joshondesign.xml.XMLParser;
import org.joshy.gfx.Core;
import org.joshy.gfx.draw.FlatColor;
import org.joshy.gfx.draw.LinearGradientFill;
import org.joshy.gfx.draw.MultiGradientFill;
import org.joshy.gfx.util.u;
import org.joshy.sketch.model.*;
import org.junit.Before;
import org.junit.Test;
import java.awt.*;
import java.awt.geom.Area;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import static org.junit.Assert.assertTrue;
/**
* Created by IntelliJ IDEA.
* User: joshmarinacci
* Date: Oct 11, 2010
* Time: 4:36:50 PM
* To change this template use File | Settings | File Templates.
*/
public class SVGExportTest {
private SketchDocument doc;
private SketchDocument.SketchPage page;
@Before
public void setUp() throws Exception {
try {
Core.init();
doc = new SketchDocument();
page = doc.getCurrentPage();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testRectangle() throws Exception {
page.clear();
page.add(new SRect(0, 0, 20, 20).setFillPaint(FlatColor.RED));
Doc xdoc = saveAndReadback(doc);
assertTrue("0.0".equals(xdoc.xpathString("/svg/rect/@x")));
assertTrue("1.0".equals(xdoc.xpathString("/svg/rect/@stroke-width")));
}
@Test public void testOval() throws Exception {
page.clear();
page.add(new SOval(0, 0, 20, 20).setFillPaint(FlatColor.RED));
Doc xdoc = saveAndReadback(doc);
assertTrue("10.0".equals(xdoc.xpathString("/svg/ellipse/@cx")));
assertTrue("10.0".equals(xdoc.xpathString("/svg/ellipse/@ry")));
assertTrue("1.0".equals(xdoc.xpathString("/svg/ellipse/@stroke-width")));
}
@Test public void testPolygon() throws Exception {
//test a polygon
SPoly poly = new SPoly();
poly.setFillPaint(FlatColor.BLUE);
poly.addPoint(new Point(0,0));
poly.addPoint(new Point(10,0));
poly.addPoint(new Point(0,10));
poly.setClosed(true);
page.clear();
page.add(poly);
Doc xdoc = saveAndReadback(doc);
assertTrue("0.0,0.0 10.0,0.0 0.0,10.0 ".equals(xdoc.xpathString("/svg/polygon/@points")));
}
@Test public void testNGon() throws Exception {
NGon ngon = new NGon();
ngon.setRadius(20);
ngon.setFillPaint(FlatColor.RED);
ngon.setSides(5);
ngon.setTranslateX(100);
ngon.setTranslateY(100);
page.clear();
page.add(ngon);
Doc xdoc = saveAndReadback(doc);
assertTrue("120.0,100.0 106.0,119.0 84.0,112.0 84.0,88.0 106.0,81.0 ".equals(xdoc.xpathString("/svg/polygon/@points")));
}
@Test public void testPath() throws Exception {
SPath path = new SPath();
path.setFillPaint(FlatColor.RED);
path.addPoint(new SPath.PathPoint(0,0, -5,0, 5,0));
path.addPoint(new SPath.PathPoint(10,10, 10,5, 10,15));
path.addPoint(new SPath.PathPoint(0,20, 5,20, 0,15));
path.close();
page.clear();
page.add(path);
Doc xdoc = saveAndReadback(doc);
assertTrue(" M 0.0 0.0 C 5.0 0.0 10.0 5.0 10.0 10.0 C 10.0 15.0 5.0 20.0 0.0 20.0 z".equals(xdoc.xpathString("/svg/path/@d")));
}
@Test public void testText() throws Exception {
SText text = new SText();
text.setText("ABC");
text.setFontSize(100);
text.setFillPaint(FlatColor.GREEN);
page.clear();
page.add(text);
Doc xdoc = saveAndReadback(doc);
assertTrue("ABC".equals(xdoc.xpathString("/svg/text/text()")));
}
@Test public void testImage() throws IOException {
}
@Test public void testGroup() throws Exception {
page.clear();
SRect rect = new SRect(0,0,10,10);
rect.setFillPaint(FlatColor.RED);
SOval oval = new SOval(0,0,10,10);
oval.setFillPaint(FlatColor.BLUE);
rect.setTranslateX(100);
oval.setTranslateY(100);
SGroup group = new SGroup();
group.addAll(rect,oval);
group.setTranslateX(50);
group.setTranslateY(50);
page.add(group);
SRect rect2 = new SRect(0,0,150,150);
rect2.setFillPaint(FlatColor.GREEN);
page.add(rect2);
Doc xdoc = saveAndReadback(doc);
assertTrue("translate(50.0,50.0)".equals(xdoc.xpathString("/svg/g/@transform")));
assertTrue("10.0".equals(xdoc.xpathString("/svg/g/rect/@width")));
assertTrue("1.0".equals(xdoc.xpathString("/svg/g/ellipse/@stroke-width")));
assertTrue("150.0".equals(xdoc.xpathString("/svg/rect/@width")));
}
@Test public void testArea() throws Exception {
SRect rect = new SRect(0,0,10,10);
rect.setFillPaint(FlatColor.RED);
SOval oval = new SOval(5,5,10,10);
oval.setFillPaint(FlatColor.BLUE);
Area area = new Area();
area.add(rect.toArea());
area.add(oval.toArea());
SArea sarea = new SArea(area);
sarea.setTranslateX(10);
sarea.setTranslateY(10);
sarea.setFillPaint(FlatColor.GREEN);
page.clear();
page.add(sarea);
Doc xdoc = saveAndReadback(doc);
assertTrue("translate(10.0,10.0)".equals(xdoc.xpathString("/svg/path/@transform")));
}
@Test public void testArrow() {
}
@Test public void testGradientRect() throws Exception {
MultiGradientFill grad = new LinearGradientFill()
.setStartX(3).setStartY(0).setEndX(97).setEndY(0)
.addStop(0, FlatColor.BLUE)
.addStop(1, FlatColor.RED);
SRect rect = new SRect(0,0,100,100);
rect.setFillPaint(grad);
rect.setStrokeWidth(0);
page.clear();
page.add(rect);
Doc xdoc = saveAndReadback(doc);
Elem e = xdoc.xpath("/svg/linearGradient/stop").iterator().next();
assertTrue("0.0".equals(e.attr("offset")));
}
@Test public void testLinearGradientRect() throws Exception {
MultiGradientFill grad = new LinearGradientFill()
.setStartX(0).setEndX(100)
.setStartY(0).setEndY(0)
.addStop(0,FlatColor.GREEN)
.addStop(0.5,FlatColor.WHITE)
.addStop(1.0,FlatColor.BLACK);
SRect rect = new SRect(0,0,100,100);
rect.setFillPaint(grad);
rect.setStrokeWidth(0);
page.clear();
page.add(rect);
Doc xdoc = saveAndReadback(doc);
Iterator<? extends Elem> it = xdoc.xpath("/svg/linearGradient/stop").iterator();
it.next();
Elem e = it.next();
assertTrue("0.5".equals(e.attr("offset")));
}
private Doc saveAndReadback(SketchDocument doc) throws Exception {
File file = File.createTempFile("amino.test", ".svg");
u.p("wrote to tempfile: " + file.getAbsolutePath());
//SaveSVGAction.exportFragment(file,doc);
Doc xdoc = XMLParser.parse(file);
return xdoc;
}
}