package test.views.jfx;
import java.util.List;
import java.util.stream.Collectors;
import javafx.scene.shape.ClosePath;
import javafx.scene.shape.CubicCurveTo;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.PathElement;
import net.sf.latexdraw.badaboom.BadaboomCollector;
import net.sf.latexdraw.models.interfaces.shape.ISingleShape;
import net.sf.latexdraw.view.jfx.ViewFactory;
import net.sf.latexdraw.view.jfx.ViewShape;
import org.junit.After;
import org.junit.Before;
import test.HelperTest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
abstract class TestViewShape<T extends ViewShape<S>, S extends ISingleShape> implements HelperTest, ITestViewShape<T, S> {
protected T view;
protected S model;
protected abstract S createModel();
protected T createView() {
return (T) ViewFactory.INSTANCE.createView(createModel()).get();
}
@Before
public void setUp() {
BadaboomCollector.INSTANCE.clear();
view = createView();
model = view.getModel();
}
@After
public void tearDown() throws Exception {
view.flush();
}
@Override
public T getView() {
return view;
}
@Override
public S getModel() {
return model;
}
public static void assertPathSameButNotEqual(final List<PathElement> p1, final List<PathElement> p2) {
assertEquals(p1.size(), p2.size());
for(int i=0, size=p2.size(); i<size; i++) {
if(p1.get(i) instanceof ClosePath) {
assertTrue(p2.get(i) instanceof ClosePath);
}else {
assertNotEquals(p1.get(i), p2.get(i));
}
}
}
protected static List<PathElement> duplicatePath(final List<PathElement> path) {
return path.stream().map(elt -> {
PathElement dupelt;
if(elt instanceof MoveTo) {
final MoveTo moveTo = (MoveTo) elt;
dupelt = ViewFactory.INSTANCE.createMoveTo(moveTo.getX(), moveTo.getY());
}else if(elt instanceof LineTo) {
final LineTo lineTo = (LineTo) elt;
dupelt = ViewFactory.INSTANCE.createLineTo(lineTo.getX(), lineTo.getY());
}else if(elt instanceof ClosePath) {
dupelt = ViewFactory.INSTANCE.createClosePath();
}else if(elt instanceof CubicCurveTo) {
final CubicCurveTo cct = (CubicCurveTo) elt;
dupelt = ViewFactory.INSTANCE.createCubicCurveTo(cct.getControlX1(), cct.getControlY1(), cct.getControlX2(), cct.getControlY2(), cct.getX(), cct.getY());
}else {
throw new IllegalArgumentException();
}
dupelt.setAbsolute(elt.isAbsolute());
return dupelt;
}).collect(Collectors.toList());
}
}