package com.baselet.element.sticking;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.baselet.control.basics.geom.PointDouble;
import com.baselet.element.sticking.StickingPolygon.StickLine;
public class StickablesTest {
@Test
public void moveLineLeft40_pointLeft40() throws Exception {
PointChange change = calcChange(point(20, 20), vLine(20, 10, 30), -40, 0);
assertPoint(-40, 0, change);
}
@Test
public void moveLineRight40_pointRight40() throws Exception {
PointChange change = calcChange(point(20, 20), vLine(20, 10, 30), 40, 0);
assertPoint(40, 0, change);
}
@Test
public void moveLineUp40_pointUp40() throws Exception {
PointChange change = calcChange(point(20, 20), hLine(10, 30, 20), 0, -40);
assertPoint(0, -40, change);
}
@Test
public void moveLineLeftDown40_pointLeftDown40() throws Exception {
PointChange change = calcChange(point(20, 20), hLine(10, 30, 20), 40, 40);
assertPoint(40, 40, change);
}
@Test
public void moveLineRightDown10_pointRightDown10() throws Exception {
PointChange change = calcChange(point(20, 20), vLine(20, 10, 30), 10, 10);
assertPoint(10, 10, change);
}
@Test
public void resizeLineVertical_pointStaysSame() throws Exception {
PointChange change = calcChange(point(20, 20), vLine(20, 10, 80), vLine(20, 10, 20));
assertPoint(0, 0, change);
}
@Test
public void resizeLineVertical_pointMovesToLowerEnd() throws Exception {
PointChange change = calcChange(point(20, 70), vLine(20, 10, 80), vLine(20, 10, 30));
assertPoint(0, -40, change);
}
@Test
public void resizeLineHorizontal_pointStaysOnLeftEnd() throws Exception {
PointChange change = calcChange(point(20, 50), hLine(20, 150, 50), hLine(100, 150, 50));
assertPoint(80, 0, change);
}
@Test
public void resizeLineVertical_pointStaysOnUpperEnd() throws Exception {
PointChange change = calcChange(point(20, 50), vLine(20, 50, 200), vLine(20, 150, 200));
assertPoint(0, 100, change);
}
@Test
public void resizeLineHorizontal_pointStaysSame() throws Exception {
PointChange change = calcChange(point(20, 50), hLine(20, 150, 50), hLine(100, 150, 50));
assertPoint(80, 0, change);
}
@Test
public void moveHorizontalResizeVertical_pointMovesHorizontalAndStaysSameVertical() throws Exception {
PointChange change = calcChange(point(100, 100), vLine(100, 10, 200), vLine(60, 10, 150));
assertPoint(-40, 0, change);
}
@Test
public void moveHorizontalResizeVertical_pointMovesHorizontalAndMovesToEndVertical() throws Exception {
PointChange change = calcChange(point(50, 50), vLine(50, 10, 200), vLine(100, 10, 30));
assertPoint(50, -20, change);
}
@Test
public void moveVerticalResizeHorizontal_pointMovesVerticalAndStaysSameHorizontal() throws Exception {
PointChange change = calcChange(point(50, 50), hLine(10, 200, 50), hLine(10, 50, 100));
assertPoint(0, 50, change);
}
@Test
public void moveVerticalResizeHorizontal_pointMovesVerticalAndStaysOnLeftEnd() throws Exception {
PointChange change = calcChange(point(50, 50), hLine(10, 200, 50), hLine(10, 20, 100));
assertPoint(-30, 50, change);
}
private void assertPoint(int x, int y, PointChange change) {
assertEquals("correct x movement", x, change.getDiffX());
assertEquals("correct y movement", y, change.getDiffY());
}
private PointChange calcChange(PointDouble point, StickLine oldLine, int xChange, int yChange) {
PointDouble oStart = oldLine.getStart();
PointDouble oEnd = oldLine.getEnd();
return Stickables.calcPointDiffBasedOnStickLineChange(0, point, new StickLineChange(oldLine, line(oStart.getX() + xChange, oStart.getY() + yChange, oEnd.getX() + xChange, oEnd.getY() + yChange)));
}
private PointChange calcChange(PointDouble point, StickLine oldLine, StickLine newLine) {
return Stickables.calcPointDiffBasedOnStickLineChange(0, point, new StickLineChange(oldLine, newLine));
}
private static PointDouble point(double x, double y) {
return new PointDouble(x, y);
}
private static StickLine line(double xStart, double yStart, double xEnd, double yEnd) {
return new StickLine(point(xStart, yStart), point(xEnd, yEnd));
}
private static StickLine hLine(double xStart, double xEnd, double y) {
return line(xStart, y, xEnd, y);
}
private static StickLine vLine(double x, double yStart, double yEnd) {
return line(x, yStart, x, yEnd);
}
}