package test.gui;
import com.google.inject.AbstractModule;
import java.util.concurrent.TimeoutException;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.input.KeyCode;
import net.sf.latexdraw.instruments.Hand;
import net.sf.latexdraw.instruments.Pencil;
import net.sf.latexdraw.models.ShapeFactory;
import net.sf.latexdraw.models.interfaces.shape.IRectangle;
import net.sf.latexdraw.view.MagneticGrid;
import net.sf.latexdraw.view.jfx.Canvas;
import net.sf.latexdraw.view.jfx.PageView;
import net.sf.latexdraw.view.jfx.ViewRectangle;
import net.sf.latexdraw.view.latex.DviPsColors;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.malai.action.ActionsRegistry;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class TestCanvas extends TestLatexdrawGUI {
Pencil pencil;
Hand hand;
Canvas canvas;
IRectangle addedRec;
final GUIVoidCommand addRec = () -> Platform.runLater(() -> {
addedRec = ShapeFactory.INST.createRectangle(ShapeFactory.INST.createPoint(-Canvas.ORIGIN.getX()+50, -Canvas.ORIGIN.getY()+50),
200, 100);
addedRec.setFilled(true);
addedRec.setFillingCol(DviPsColors.APRICOT);
canvas.getDrawing().addShape(addedRec);
});
final GUIVoidCommand addRec2 = () -> Platform.runLater(() -> {
IRectangle rec = ShapeFactory.INST.createRectangle(ShapeFactory.INST.createPoint(-Canvas.ORIGIN.getX()+300,
-Canvas.ORIGIN.getY()+300), 100, 100);
rec.setFilled(true);
rec.setFillingCol(DviPsColors.APRICOT);
canvas.getDrawing().addShape(rec);
});
final GUIVoidCommand clickOnAddedRec = () -> rightClickOn(getPane().getChildren().get(0));
final GUIVoidCommand ctrlClickOnAddedRec2 = () -> press(KeyCode.CONTROL).rightClickOn(getPane().getChildren().get(1)).release(KeyCode.CONTROL);
final GUIVoidCommand shiftClickOnAddedRec = () -> press(KeyCode.SHIFT).rightClickOn(getPane().getChildren().get(0)).release(KeyCode.SHIFT);
@Override
public String getFXMLPathFromLatexdraw() {
return "/fxml/Canvas.fxml";
}
@Override
protected AbstractModule createModule() {
return new ShapePropModule() {
@Override
protected void configure() {
super.configure();
pencil = mock(Pencil.class);
bind(Hand.class).asEagerSingleton();
bind(Pencil.class).toInstance(pencil);
}
};
}
@Override
@Before
public void setUp() {
super.setUp();
pencil = (Pencil) guiceFactory.call(Pencil.class);
hand = (Hand) guiceFactory.call(Hand.class);
canvas = (Canvas) guiceFactory.call(Canvas.class);
hand.setActivated(true);
when(pencil.isActivated()).thenReturn(false);
Platform.runLater(() -> {
final int width = 800;
final int height = 600;
stage.minHeightProperty().unbind();
stage.minWidthProperty().unbind();
canvas.setMaxWidth(width);
canvas.setMaxHeight(height);
canvas.getScene().getWindow().setWidth(width);
canvas.getScene().getWindow().setHeight(height);
stage.setMaxWidth(width);
stage.setMaxHeight(height);
stage.setMinWidth(width);
stage.setMinHeight(height);
stage.centerOnScreen();
stage.toFront();
});
}
@Override
@After
public void tearDown() throws TimeoutException {
super.tearDown();
ActionsRegistry.INSTANCE.removeHandler(canvas);
}
Group getPane() {
return (Group) canvas.getChildren().get(2);
}
@Test
public void testPageViewExits() {
assertTrue(canvas.getChildren().get(0) instanceof PageView);
}
@Test
public void testMagneticGridExists() {
assertTrue(canvas.getChildren().get(1) instanceof MagneticGrid);
}
@Test
public void testViewsPaneExists() {
assertTrue(canvas.getChildren().get(2) instanceof Group);
}
@Test
public void testViewsPanePositionORIGIN() {
Group group = getPane();
assertEquals(Canvas.ORIGIN.getX(), group.getLayoutX(), 0.000001);
assertEquals(Canvas.ORIGIN.getY(), group.getLayoutY(), 0.000001);
}
@Test
public void testShapeAddedViewCreated() {
new CompositeGUIVoidCommand(addRec, waitFXEvents).execute();
assertEquals(1, getPane().getChildren().size());
}
@Test
public void testShapeAddedViewRecCreated() {
new CompositeGUIVoidCommand(addRec, waitFXEvents).execute();
assertTrue(getPane().getChildren().get(0) instanceof ViewRectangle);
}
@Test
public void testOneClickOnShapeSelectsIt() {
new CompositeGUIVoidCommand(addRec, waitFXEvents, clickOnAddedRec, waitFXEvents).execute();
assertEquals(1, canvas.getDrawing().getSelection().size());
assertSame(addedRec, canvas.getDrawing().getSelection().getShapeAt(0));
}
@Test
public void testTwoClicksOnShapeSelectsItOneTime() {
new CompositeGUIVoidCommand(addRec, waitFXEvents, clickOnAddedRec, waitFXEvents, clickOnAddedRec, waitFXEvents).execute();
assertEquals(1, canvas.getDrawing().getSelection().size());
}
@Test
public void testShiftClickOnShapeDeselectsIt() {
new CompositeGUIVoidCommand(addRec, waitFXEvents, clickOnAddedRec, waitFXEvents, shiftClickOnAddedRec, waitFXEvents).execute();
assertTrue(canvas.getDrawing().getSelection().isEmpty());
}
@Test
public void testCtrlClickOnShapeAddsSelection() {
new CompositeGUIVoidCommand(addRec, addRec2, waitFXEvents, clickOnAddedRec, waitFXEvents, ctrlClickOnAddedRec2, waitFXEvents).execute();
assertEquals(2, canvas.getDrawing().getSelection().size());
assertNotSame(canvas.getDrawing().getSelection().getShapeAt(0), canvas.getDrawing().getSelection().getShapeAt(1));
}
@Test
public void testTwoAddsAndShiftClickSelectsOneShape() {
new CompositeGUIVoidCommand(addRec, addRec2, waitFXEvents, clickOnAddedRec, waitFXEvents, ctrlClickOnAddedRec2, waitFXEvents,
shiftClickOnAddedRec, waitFXEvents).execute();
assertEquals(1, canvas.getDrawing().getSelection().size());
assertNotSame(addedRec, canvas.getDrawing().getSelection().getShapeAt(0));
}
}