package test.views.jfx;
import java.util.Arrays;
import java.util.concurrent.TimeoutException;
import javafx.scene.paint.Color;
import javafx.scene.paint.ImagePattern;
import javafx.scene.paint.LinearGradient;
import javafx.scene.shape.Shape;
import javafx.scene.shape.StrokeLineCap;
import net.sf.latexdraw.models.ShapeFactory;
import net.sf.latexdraw.models.interfaces.shape.BorderPos;
import net.sf.latexdraw.models.interfaces.shape.FillingStyle;
import net.sf.latexdraw.models.interfaces.shape.ISingleShape;
import net.sf.latexdraw.models.interfaces.shape.LineStyle;
import net.sf.latexdraw.view.jfx.ViewSingleShape;
import net.sf.latexdraw.view.latex.DviPsColors;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
abstract class TestViewBorderedShape<T extends ViewSingleShape<S, R>, S extends ISingleShape, R extends Shape> extends TestViewShape<T, S>
implements ITestViewBorderedShape<T, S, R> {
protected R border;
@Override
@Before
public void setUp() {
super.setUp();
border = view.getBorder();
}
@Override
public R getBorder() {
return border;
}
@Test
public void testLineColor() {
model.setLineColour(DviPsColors.BITTERSWEET);
assertEquals(DviPsColors.BITTERSWEET, ShapeFactory.INST.createColorFX((javafx.scene.paint.Color) border.getStroke()));
}
@Test
public void testLineThickness() {
if(model.isThicknessable()) {
model.setThickness(10d);
assertEquals(10d, border.getStrokeWidth(), 0.001);
}
}
@Test
public void testBorderAdded() {
assertTrue(view.getChildren().stream().anyMatch(c -> c == border));
}
@Test
public void testBorderEnable() {
assertFalse(view.getBorder().isDisable());
}
@Test
public void testDoubleLineThickness() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
assertEquals(model.getFullThickness(), border.getStrokeWidth(), 0.001);
}
}
@Test
public void testDoubleLineSepThickness() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
model.setDbleBordSep(30d);
assertEquals(model.getFullThickness(), border.getStrokeWidth(), 0.001);
}
}
@Test
public void testDoubleLineCol() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
model.setDbleBordCol(DviPsColors.APRICOT);
assertEquals(DviPsColors.APRICOT, view.getDbleBorder().map(b -> ShapeFactory.INST.createColorFX((Color) b.getStroke())).orElse(null));
}
}
@Test
public void testDoubleBorderAdded() {
if(model.isDbleBorderable()) {
assertTrue(view.getChildren().stream().anyMatch(c -> c == view.getDbleBorder().get()));
}
}
@Test
public void testDoubleBorderDefaultDisable() {
if(model.isDbleBorderable()) {
assertTrue(view.getDbleBorder().get().isDisable());
}
}
@Test
public void testDoubleBorderEnable() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
assertFalse(view.getDbleBorder().get().isDisable());
}
}
@Test
public void testDoubleBorderDisable() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
model.setHasDbleBord(false);
assertTrue(view.getDbleBorder().get().isDisable());
}
}
@Test
public void testDoubleBorderDefaultVisible() {
if(model.isDbleBorderable()) {
assertFalse(view.getDbleBorder().get().isVisible());
}
}
@Test
public void testDoubleBorderVisible() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
assertTrue(view.getDbleBorder().get().isVisible());
}
}
@Test
public void testDoubleBorderNotVisible() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
model.setHasDbleBord(false);
assertFalse(view.getDbleBorder().get().isVisible());
}
}
@Test
public void testDoubleBorderStrokeWidth() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
assertEquals(model.getDbleBordSep(), view.getDbleBorder().get().getStrokeWidth(), 0.001);
}
}
@Test
public void testDoubleBorderNoFill() {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
assertNull(view.getDbleBorder().get().getFill());
}
}
@Test
public void testLineStylePlainLineCap() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.SOLID);
assertEquals(StrokeLineCap.SQUARE, border.getStrokeLineCap());
}
}
@Test
public void testLineStyleDashedSep() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DASHED);
assertEquals(Arrays.asList(model.getDashSepBlack(), model.getDashSepWhite()), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDashedLineCap() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DASHED);
assertEquals(StrokeLineCap.BUTT, border.getStrokeLineCap());
}
}
@Test
public void testDashSepBlackBefore() {
if(model.isLineStylable()) {
model.setDashSepBlack(21d);
model.setLineStyle(LineStyle.DASHED);
assertEquals(Arrays.asList(21d, model.getDashSepWhite()), border.getStrokeDashArray());
}
}
@Test
public void testDashSepBlack() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DASHED);
model.setDashSepBlack(21d);
assertEquals(Arrays.asList(21d, model.getDashSepWhite()), border.getStrokeDashArray());
}
}
@Test
public void testDashSepWhite() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DASHED);
model.setDashSepWhite(2.451);
assertEquals(Arrays.asList(model.getDashSepBlack(), 2.451), border.getStrokeDashArray());
}
}
@Test
public void testDashSepWhiteBefore() {
if(model.isLineStylable()) {
model.setDashSepWhite(2.451);
model.setLineStyle(LineStyle.DASHED);
assertEquals(Arrays.asList(model.getDashSepBlack(), 2.451), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDottedLineCap() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DOTTED);
assertEquals(StrokeLineCap.ROUND, border.getStrokeLineCap());
}
}
@Test
public void testLineStyleDottedSepSimpleLine() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DOTTED);
assertEquals(Arrays.asList(0d, model.getDotSep() + model.getFullThickness()), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDottedSepDoubleLine() {
if(model.isLineStylable()) {
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
}
model.setLineStyle(LineStyle.DOTTED);
assertEquals(Arrays.asList(0d, model.getDotSep() + model.getFullThickness()), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDottedSepDoubleLineAfterLineStyle() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DOTTED);
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
}
assertEquals(Arrays.asList(0d, model.getDotSep() + model.getFullThickness()), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDottedSepDoubleLineDoubleSep() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DOTTED);
if(model.isDbleBorderable()) {
model.setHasDbleBord(true);
model.setDbleBordSep(33d);
}
assertEquals(Arrays.asList(0d, model.getDotSep() + model.getFullThickness()), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDottedSepBefore() {
if(model.isLineStylable()) {
model.setDotSep(23.23);
model.setLineStyle(LineStyle.DOTTED);
assertEquals(Arrays.asList(0d, 23.23 + model.getFullThickness()), border.getStrokeDashArray());
}
}
@Test
public void testLineStyleDottedSepAfter() {
if(model.isLineStylable()) {
model.setLineStyle(LineStyle.DOTTED);
model.setDotSep(23.23);
assertEquals(Arrays.asList(0d, 23.23 + model.getFullThickness()), border.getStrokeDashArray());
}
}
@Test
public void testFillPlain() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.PLAIN);
assertEquals(Color.WHITE, border.getFill());
}
}
@Test
public void testFillPlainColor() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.PLAIN);
model.setFillingCol(DviPsColors.OLIVEGREEN);
assertEquals(DviPsColors.OLIVEGREEN.toJFX(), border.getFill());
}
}
@Test
public void testFillNone() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.PLAIN);
model.setFillingStyle(FillingStyle.NONE);
assertNull(border.getFill());
}
}
@Test
public void testFillGradient() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.GRAD);
assertTrue(border.getFill() instanceof LinearGradient);
}
}
@Test
public void testFillGradientColor1() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.GRAD);
model.setGradColStart(DviPsColors.DANDELION);
LinearGradient grad = (LinearGradient) border.getFill();
assertEquals(DviPsColors.DANDELION.toJFX(), grad.getStops().get(0).getColor());
}
}
@Test
public void testFillGradientColor2() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.GRAD);
model.setGradColEnd(DviPsColors.BRICKRED);
LinearGradient grad = (LinearGradient) border.getFill();
assertEquals(DviPsColors.BRICKRED.toJFX(), grad.getStops().get(1).getColor());
}
}
@Test
public void testFillGradientAngle() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.GRAD);
LinearGradient grad1 = (LinearGradient) border.getFill();
model.setGradAngle(Math.PI / 1.23);
assertNotEquals(grad1, border.getFill());
}
}
@Test
public void testFillGradientMidPt() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.GRAD);
LinearGradient grad1 = (LinearGradient) border.getFill();
model.setGradMidPt(0.6352);
assertNotEquals(grad1, border.getFill());
}
}
@Test
public void testFillHatchingsCLINES() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.CLINES);
assertTrue(border.getFill() instanceof ImagePattern);
}
}
@Test
public void testFillHatchingsVLINES() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.VLINES);
assertTrue(border.getFill() instanceof ImagePattern);
}
}
@Test
public void testFillHatchingsCLINESPLAIN() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.CLINES_PLAIN);
assertTrue(border.getFill() instanceof ImagePattern);
}
}
@Test
public void testFillHatchingsVLINESPLAIN() throws TimeoutException {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.VLINES_PLAIN);
assertTrue(border.getFill() instanceof ImagePattern);
}
}
@Test
public void testFillHatchingsHLINES() throws TimeoutException {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES);
assertTrue(border.getFill() instanceof ImagePattern);
}
}
@Test
public void testFillHatchingsHLINESPLAIN() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES_PLAIN);
assertTrue(border.getFill() instanceof ImagePattern);
}
}
@Test
public void testFillHatchingsWidth() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES);
assertNotEqualsSnapshot(view, () -> model.setHatchingsWidth(model.getHatchingsWidth() + 10d));
}
}
@Test
public void testFillHatchingsSep() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES);
assertNotEqualsSnapshot(view, () -> model.setHatchingsSep(model.getHatchingsSep() + 10d));
}
}
@Test
public void testFillHatchingsAngle() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES);
assertNotEqualsSnapshot(view, () -> model.setHatchingsAngle(model.getHatchingsAngle() + Math.PI / 3d));
}
}
@Test
public void testFillHatchingsCol() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES);
assertNotEqualsSnapshot(view, () -> model.setHatchingsCol(DviPsColors.FUSHIA));
}
}
@Test
public void testFillHatchingsFillingCol() {
if(model.isFillable()) {
model.setFillingStyle(FillingStyle.HLINES);
assertNotEqualsSnapshot(view, () -> {
model.setFillingStyle(FillingStyle.HLINES_PLAIN);
model.setFillingCol(DviPsColors.FUSHIA);
});
}
}
@Test
public void testShadowAdded() {
if(model.isDbleBorderable()) {
assertTrue(view.getChildren().stream().anyMatch(c -> c == view.getShadow().get()));
}
}
@Test
public void testShadowDefaultDisable() {
if(model.isShadowable()) {
assertTrue(view.getShadow().get().isDisable());
}
}
@Test
public void testShadowEnable() {
if(model.isShadowable()) {
model.setHasShadow(true);
assertFalse(view.getShadow().get().isDisable());
}
}
@Test
public void testShadowDisable() {
if(model.isShadowable()) {
model.setHasShadow(true);
model.setHasShadow(false);
assertTrue(view.getShadow().get().isDisable());
}
}
@Test
public void testShadowColorStroke() {
if(model.isShadowable()) {
model.setHasShadow(true);
model.setShadowCol(DviPsColors.NAVYBLUE);
assertEquals(DviPsColors.NAVYBLUE.toJFX(), view.getShadow().get().getStroke());
}
}
@Test
public void testShadowColorFillWhenFilled() {
if(model.isShadowable() && model.isFillable()) {
model.setHasShadow(true);
model.setFillingStyle(FillingStyle.PLAIN);
model.setShadowCol(DviPsColors.APRICOT);
assertEquals(DviPsColors.APRICOT.toJFX(), view.getShadow().get().getFill());
}
}
@Test
public void testShadowColorFillWhenNotFilled() {
if(model.isShadowable() && model.isFillable() && !model.shadowFillsShape()) {
model.setHasShadow(true);
model.setFillingStyle(FillingStyle.NONE);
assertNull(view.getShadow().get().getFill());
}
}
@Test
public void testShadowColorFillWhenNotFilledButShadowFills() {
if(model.isShadowable() && model.isFillable() && model.shadowFillsShape()) {
model.setHasShadow(true);
model.setFillingStyle(FillingStyle.NONE);
model.setShadowCol(DviPsColors.APRICOT);
assertEquals(DviPsColors.APRICOT.toJFX(), view.getShadow().get().getFill());
}
}
@Test
public void testShadowBoundNotSamePositionThanBorder() {
if(model.isShadowable()) {
model.setHasShadow(true);
assertNotEquals(border.getBoundsInParent().getMinX(), view.getShadow().get().getBoundsInParent().getMinX(), 0.001);
assertNotEquals(border.getBoundsInParent().getMinY(), view.getShadow().get().getBoundsInParent().getMinY(), 0.001);
}
}
@Test
public void testLineSizeShadowSameThanBorder() {
if(model.isThicknessable()) {
model.setThickness(20d);
assertEquals(20d, view.getShadow().get().getStrokeWidth(), 0.001);
}
}
@Test
public void testLinePositionShadowSameThanBorder() {
if(model.isThicknessable()) {
model.setBordersPosition(BorderPos.INTO);
assertEquals(border.getStrokeType(), view.getShadow().get().getStrokeType());
}
}
@Test
public void testShadowBoundSizeSameThanBorder() {
if(model.isShadowable()) {
model.setHasShadow(true);
assertEquals(border.getBoundsInLocal().getWidth(), view.getShadow().get().getBoundsInLocal().getWidth(), 0.001);
assertEquals(border.getBoundsInLocal().getHeight(), view.getShadow().get().getBoundsInLocal().getHeight(), 0.001);
}
}
@Test
public void testShadowAngle0Translate() {
if(model.isShadowable()) {
model.setHasShadow(true);
model.setShadowAngle(0d);
assertEquals(model.getShadowSize(), view.getShadow().get().getTranslateX(), 0.01);
assertEquals(0d, view.getShadow().get().getTranslateY(), 0.01);
}
}
@Test
public void testShadowSizeAngle0Translate() {
if(model.isShadowable()) {
model.setHasShadow(true);
model.setShadowAngle(0d);
model.setShadowSize(100.21d);
assertEquals(100.21, view.getShadow().get().getTranslateX(), 0.01);
assertEquals(0d, view.getShadow().get().getTranslateY(), 0.01);
}
}
@Test
public void testShadowAngle90Translate() {
if(model.isShadowable()) {
model.setHasShadow(true);
model.setShadowAngle(Math.PI / 2d);
assertEquals(0d, view.getShadow().get().getTranslateX(), 0.01);
assertEquals(-model.getShadowSize(), view.getShadow().get().getTranslateY(), 0.01);
}
}
@Test
public abstract void testShadowPositionSameThanBorder();
@Test
public void testShadowBeforeBorder() {
if(model.isShadowable()) {
assertTrue(view.getChildren().indexOf(border) > view.getChildren().indexOf(view.getShadow().get()));
}
}
@Test
public void testDbleBorderAfterBorder() {
if(model.isDbleBorderable()) {
assertTrue(view.getChildren().indexOf(border) < view.getChildren().indexOf(view.getDbleBorder().get()));
}
}
}