showWindow(frame);
// 2. Use CREATE_WALLS mode
JComponentTester tester = new JComponentTester();
tester.click(frame.createWallsButton);
PlanComponent planComponent = (PlanComponent)
frame.homeController.getPlanController().getView();
// Click at (30, 30), (220, 30), (270, 80), (270, 170), (30, 170)
// then double click at (30, 30) with no magnetism
tester.actionKeyPress(KeyEvent.VK_SHIFT);
tester.actionClick(planComponent, 30, 30);
tester.actionClick(planComponent, 220, 30);
tester.actionClick(planComponent, 270, 80);
tester.actionClick(planComponent, 270, 170);
tester.actionClick(planComponent, 30, 170);
tester.actionClick(planComponent, 30, 30, InputEvent.BUTTON1_MASK, 2);
tester.actionKeyRelease(KeyEvent.VK_SHIFT);
// Check 5 walls were added to home plan
assertEquals("Wrong walls count", 5, frame.home.getWalls().size());
// 3. Use SELECTION mode
tester.click(frame.selectButton);
// Select the first piece in catalog tree
JTree catalogTree = (JTree)
frame.homeController.getFurnitureCatalogController().getView();
catalogTree.expandRow(0);
catalogTree.addSelectionInterval(1, 1);
// Click on Add furniture button
tester.click(frame.addButton);
// Check home contains one selected piece
tester.waitForIdle();
assertEquals("Wrong piece count",
1, frame.home.getFurniture().size());
assertEquals("Wrong selected items count",
1, frame.home.getSelectedItems().size());
HomePieceOfFurniture piece = frame.home.getFurniture().get(0);
float pieceWidth = piece.getWidth();
float pieceDepth = piece.getDepth();
float pieceHeight = piece.getHeight();
float pieceX = pieceWidth / 2;
float pieceY = pieceDepth / 2;
assertLocationAndOrientationEqualPiece(pieceX, pieceY, 0, piece);
// 4. Press mouse button at piece center
int widthPixel = Math.round(pieceWidth * planComponent.getScale());
int depthPixel = Math.round(pieceDepth * planComponent.getScale());
tester.actionMousePress(planComponent, new ComponentLocation(
new Point(20 + widthPixel / 2, 20 + depthPixel / 2)));
// Drag mouse to (100, 100) from piece center
tester.actionMousePress(planComponent, new ComponentLocation(
new Point(20 + widthPixel / 2 + 100, 20 + depthPixel / 2 + 100)));
tester.actionMouseRelease();
// Check piece moved
pieceX += 200;
pieceY += 200;
assertLocationAndOrientationEqualPiece(pieceX, pieceY, 0, piece);
// 5. Press mouse button at top left point of selected piece
tester.actionMousePress(planComponent,
new ComponentLocation(new Point(120, 120)));
// Drag mouse to (-depthPixel / 2 - 1, widthPixel / 2) pixels from piece center
tester.actionMouseMove(planComponent, new ComponentLocation(
new Point(120 + widthPixel / 2 - depthPixel / 2 - 1,
120 + depthPixel / 2 + widthPixel / 2)));
tester.actionMouseRelease();
// Check piece angle is 3 * PI / 2 (=-90�)
assertLocationAndOrientationEqualPiece(
pieceX, pieceY, (float)Math.PI * 3 / 2, piece);
// 6. Press mouse button at top left point of selected piece
tester.actionMousePress(planComponent, new ComponentLocation(
new Point(120 + widthPixel / 2 - depthPixel / 2,
120 + depthPixel / 2 + widthPixel / 2)));
// Drag mouse to the previous position plus 1 pixel along x axis
tester.actionMouseMove(planComponent, new ComponentLocation(
new Point(121, 120)));
// Check piece angle is 0�
assertLocationAndOrientationEqualPiece(pieceX, pieceY, 0, piece);
// Press Shift key
tester.actionKeyPress(KeyEvent.VK_SHIFT);
// Check piece angle is different from 0�
assertFalse("Piece orientation shouldn't be magnetized",
Math.abs(piece.getAngle()) < 1E-10);
tester.actionKeyRelease(KeyEvent.VK_SHIFT);
tester.actionKeyStroke(planComponent, KeyEvent.VK_ESCAPE);
tester.actionMouseRelease();
// Check piece angle is 3 * PI / 2 (=-90�)
assertLocationAndOrientationEqualPiece(
pieceX, pieceY, (float)Math.PI * 3 / 2, piece);
// 7. Click at point (30, 160) with Shift key depressed
tester.actionKeyPress(KeyEvent.VK_SHIFT);
tester.actionClick(planComponent, 30, 160);
tester.actionKeyRelease(KeyEvent.VK_SHIFT);
// Check selected items contains the piece of furniture and the fifth wall
List<Selectable> selectedItems =
new ArrayList<Selectable>(frame.home.getSelectedItems());
assertEquals("Wrong selected items count", 2, selectedItems.size());
assertTrue("Piece of furniture not selected", selectedItems.contains(piece));
// Remove piece form list to get the selected wall
selectedItems.remove(piece);
Wall fifthWall = (Wall)selectedItems.get(0);
// Check piece and wall coordinates
assertLocationAndOrientationEqualPiece(
pieceX, pieceY, (float)Math.PI * 3 / 2, piece);
assertCoordinatesEqualWallPoints(20, 300, 20, 20, fifthWall);
// 8. Drag and drop mouse to (40, 160)
Thread.sleep(1000); // Wait 1s to avoid double click
tester.actionMousePress(planComponent,
new ComponentLocation(new Point(30, 160)));
tester.actionMouseMove(planComponent,
new ComponentLocation(new Point(40, 160)));
tester.actionMouseRelease();
// Check the piece of furniture moved 20 cm along x axis
assertLocationAndOrientationEqualPiece(
pieceX + 20, pieceY, (float)Math.PI * 3 / 2, piece);
assertCoordinatesEqualWallPoints(40, 300, 40, 20, fifthWall);
// 9. Click twice on undo button
tester.invokeAndWait(new Runnable() {
public void run() {
frame.undoButton.doClick();
frame.undoButton.doClick();
}
});
// Check piece orientation and location are canceled
assertLocationAndOrientationEqualPiece(
pieceX, pieceY, 0f, piece);
assertCoordinatesEqualWallPoints(20, 300, 20, 20, fifthWall);
// 10. Click twice on redo button
tester.invokeAndWait(new Runnable() {
public void run() {
frame.redoButton.doClick();
frame.redoButton.doClick();
}
});
// Check piece and wall location was redone
assertLocationAndOrientationEqualPiece(
pieceX + 20, pieceY, (float)Math.PI * 3 / 2, piece);
assertCoordinatesEqualWallPoints(40, 300, 40, 20, fifthWall);
// Check selected items contains the piece of furniture and the fifth wall
selectedItems = frame.home.getSelectedItems();
assertEquals("Wrong selected items count",
2, selectedItems.size());
assertTrue("Piece of furniture not selected",
selectedItems.contains(piece));
assertTrue("Fifth wall not selected",
selectedItems.contains(fifthWall));
// 11. Click at point (pieceXPixel + depthPixel / 2, pieceYPixel - widthPixel / 2)
// at width and depth resize point of the piece
int pieceXPixel = Math.round((piece.getX() + 40) * planComponent.getScale());
int pieceYPixel = Math.round((piece.getY() + 40) * planComponent.getScale());
tester.actionClick(planComponent, pieceXPixel + depthPixel / 2, pieceYPixel - widthPixel / 2);
// Check selected items contains only the piece of furniture
selectedItems = frame.home.getSelectedItems();
assertEquals("Wrong selected items count", 1, selectedItems.size());
assertTrue("Piece of furniture not selected", selectedItems.contains(piece));
// Drag mouse (4,4) pixels out of piece box with magnetism disabled
Thread.sleep(1000); // Wait 1s to avoid double click
tester.actionMousePress(planComponent, new ComponentLocation(new Point(
pieceXPixel + depthPixel / 2, pieceYPixel - widthPixel / 2)));
tester.actionKeyPress(KeyEvent.VK_SHIFT);
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(
pieceXPixel + depthPixel / 2 + 4, pieceYPixel - widthPixel / 2 + 4)));
tester.actionMouseRelease();
tester.actionKeyRelease(KeyEvent.VK_SHIFT);
// Check piece width and depth were resized (caution : piece angle is oriented at 90�)
assertDimensionEqualPiece(pieceWidth - 4 / planComponent.getScale(),
pieceDepth + 4 / planComponent.getScale(), pieceHeight, piece);
// 12. Click at point (pieceXPixel + depthPixel / 2, pieceYPixel + widthPixel / 2)
// at height resize point of the piece
pieceXPixel = Math.round((piece.getX() + 40) * planComponent.getScale());
pieceYPixel = Math.round((piece.getY() + 40) * planComponent.getScale());
widthPixel = Math.round((piece.getWidth()) * planComponent.getScale());
depthPixel = Math.round((piece.getDepth()) * planComponent.getScale());
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(
pieceXPixel + depthPixel / 2, pieceYPixel + widthPixel / 2)));
Thread.sleep(1000);
tester.actionMousePress(planComponent, new ComponentLocation(new Point(
pieceXPixel + depthPixel / 2, pieceYPixel + widthPixel / 2)));
// Drag mouse (2,4) pixels
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(
pieceXPixel + depthPixel / 2 + 2, pieceYPixel + widthPixel / 2 + 4)));
tester.actionMouseRelease();
// Check piece height was resized
assertDimensionEqualPiece(pieceWidth - 4 / planComponent.getScale(),
pieceDepth + 4 / planComponent.getScale(),
Math.round((pieceHeight - 4 / planComponent.getScale()) * 2) / 2, piece);
// 13. Click at point (pieceXPixel - depthPixel / 2, pieceYPixel - widthPixel / 2)
// at elevation point of the piece
float pieceElevation = piece.getElevation();
tester.actionMousePress(planComponent, new ComponentLocation(new Point(
pieceXPixel - depthPixel / 2, pieceYPixel - widthPixel / 2)));
// Drag mouse (2,-4) pixels
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(
pieceXPixel - depthPixel / 2 + 2, pieceYPixel - widthPixel / 2 - 4)));
tester.actionMouseRelease();
// Check piece elevation was updated
assertElevationEqualPiece(pieceElevation + 4 / planComponent.getScale(), piece);
// 14. Click three times on undo button
tester.invokeAndWait(new Runnable() {
public void run() {
frame.undoButton.doClick();
frame.undoButton.doClick();
frame.undoButton.doClick();
}
});
// Check piece dimension and elevation are canceled
assertDimensionEqualPiece(pieceWidth, pieceDepth, pieceHeight, piece);
assertElevationEqualPiece(pieceElevation, piece);
// Build an ordered list of dimensions added to home
final ArrayList<DimensionLine> orderedDimensionLines = new ArrayList<DimensionLine>();
frame.home.addDimensionLinesListener(new CollectionListener<DimensionLine>() {
public void collectionChanged(CollectionEvent<DimensionLine> ev) {
if (ev.getType() == CollectionEvent.Type.ADD) {
orderedDimensionLines.add(ev.getItem());
}
}
});
// 15. Use CREATE_DIMENSION_LINES mode
tester.invokeAndWait(new Runnable() {
public void run() {
frame.createDimensionsButton.doClick();
}
});
// Draw a dimension in plan
tester.actionClick(planComponent, 280, 81);
tester.actionClick(planComponent, 281, 169, InputEvent.BUTTON1_MASK, 2);
// Draw a dimension with extension lines
tester.actionClick(planComponent, 41, 175);
tester.actionClick(planComponent, 269, 175);
tester.actionClick(planComponent, 280, 185);
// Check 2 dimensions were added to home plan
assertEquals("Wrong dimensions count", 2, frame.home.getDimensionLines().size());
// Check one dimension is selected
assertEquals("Wrong selection", 1, frame.home.getSelectedItems().size());
assertEquals("Selection doesn't contain the second dimension",
frame.home.getSelectedItems().get(0), orderedDimensionLines.get(1));
// Check the size of the created dimension lines
DimensionLine firstDimensionLine = orderedDimensionLines.get(0);
assertEqualsDimensionLine(520, 122, 520, 298, 0, firstDimensionLine);
assertEqualsDimensionLine(42, 310, 498, 310, 20, orderedDimensionLines.get(1));
// 16. Select the first dimension line
tester.click(frame.selectButton);
tester.actionClick(planComponent, 280, 90);
assertEquals("Wrong selection", 1, frame.home.getSelectedItems().size());
assertEquals("Selection doesn't contain the first dimension",
frame.home.getSelectedItems().get(0), firstDimensionLine);
// Move its end point to (330, 167)
tester.actionMousePress(planComponent, new ComponentLocation(new Point(280, 167)));
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(320, 167)));
// Check its coordinates while Shift key isn't pressed (with magnetism)
assertEqualsDimensionLine(520, 122, 567.105f, 297.7985f, 0, firstDimensionLine);
// Check its length with magnetism
float firstDimensionLineLength = (float)Point2D.distance(
firstDimensionLine.getXStart(), firstDimensionLine.getYStart(),
firstDimensionLine.getXEnd(), firstDimensionLine.getYEnd());
assertTrue("Incorrect length 182 " + firstDimensionLineLength,
Math.abs(182 - firstDimensionLineLength) < 1E-4);
// Press Shift key
tester.actionKeyPress(KeyEvent.VK_SHIFT);
// Check its coordinates while Shift key is pressed (with no magnetism)
assertEqualsDimensionLine(520, 122, 600, 298, 0, firstDimensionLine);
// Release Shift key and mouse button
tester.actionKeyRelease(KeyEvent.VK_SHIFT);
tester.actionMouseRelease();
assertEqualsDimensionLine(520, 122, 567.105f, 297.7985f, 0, firstDimensionLine);
// 17. Click three times on undo button
tester.invokeAndWait(new Runnable() {
public void run() {
frame.undoButton.doClick();
frame.undoButton.doClick();
frame.undoButton.doClick();
}
});
// Check home doesn't contain any dimension
assertEquals("Home dimensions set isn't empty", 0, frame.home.getDimensionLines().size());
// 18. Click twice on redo button
tester.invokeAndWait(new Runnable() {
public void run() {
frame.redoButton.doClick();
frame.redoButton.doClick();
}
});
// Check the size of the created dimension lines
assertEqualsDimensionLine(520, 122, 520, 298f, 0, firstDimensionLine);
assertEqualsDimensionLine(42, 310, 498, 310, 20, orderedDimensionLines.get(1));
// Click again on redo button
tester.invokeAndWait(new Runnable() {
public void run() {
frame.redoButton.doClick();
}
});
// Check the first dimension is selected
assertEquals("Wrong selection", 1, frame.home.getSelectedItems().size());
assertEquals("Selection doesn't contain the first dimension",
frame.home.getSelectedItems().get(0), firstDimensionLine);
// Check the coordinates of the first dimension
assertEqualsDimensionLine(520, 122, 567.105f, 297.7985f, 0, firstDimensionLine);
// 19. Select two walls, the piece and a dimension line
tester.actionMousePress(planComponent, new ComponentLocation(new Point(20, 100)));
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(200, 200)));
tester.actionMouseRelease();
// Check selection
selectedItems = frame.home.getSelectedItems();
assertEquals("Selection doesn't contain 4 items", 4, selectedItems.size());
int wallsCount = frame.home.getWalls().size();
int furnitureCount = frame.home.getFurniture().size();
int dimensionLinesCount = frame.home.getDimensionLines().size();
HomePieceOfFurniture selectedPiece = Home.getFurnitureSubList(selectedItems).get(0);
pieceX = selectedPiece.getX();
pieceY = selectedPiece.getY();
// Start items duplication
tester.actionKeyPress(OperatingSystem.isMacOSX() ? KeyEvent.VK_ALT : KeyEvent.VK_CONTROL);
tester.actionMousePress(planComponent, new ComponentLocation(new Point(50, 170)));
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(51, 170)));
// Check selection changed
assertFalse("Selection didn't change", selectedItems.equals(frame.home.getSelectedItems()));
assertEquals("Selection doesn't contain 4 items", 4, frame.home.getSelectedItems().size());
assertEquals("No new wall", wallsCount + 2, frame.home.getWalls().size());
assertEquals("No new piece", furnitureCount + 1, frame.home.getFurniture().size());
assertEquals("No new dimension lines", dimensionLinesCount + 1, frame.home.getDimensionLines().size());
// 20. Duplicate and move items
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(70, 200)));
// Check the piece moved and the original piece didn't move
HomePieceOfFurniture movedPiece =
Home.getFurnitureSubList(frame.home.getSelectedItems()).get(0);
assertLocationAndOrientationEqualPiece(pieceX + 20 / planComponent.getScale(),
pieceY + 30 / planComponent.getScale(), selectedPiece.getAngle(), movedPiece);
assertLocationAndOrientationEqualPiece(pieceX, pieceY, selectedPiece.getAngle(), selectedPiece);
// 21. Release Alt key
tester.actionKeyRelease(OperatingSystem.isMacOSX() ? KeyEvent.VK_ALT : KeyEvent.VK_CONTROL);
// Check original items replaced duplicated items
assertTrue("Original items not selected", selectedItems.equals(frame.home.getSelectedItems()));
assertLocationAndOrientationEqualPiece(pieceX + 20 / planComponent.getScale(),
pieceY + 30 / planComponent.getScale(), selectedPiece.getAngle(), selectedPiece);
assertFalse("Duplicated piece still in home", frame.home.getFurniture().contains(movedPiece));
// Press Alt key again
tester.actionKeyPress(OperatingSystem.isMacOSX() ? KeyEvent.VK_ALT : KeyEvent.VK_CONTROL);
// Check the duplicated piece moved and the original piece moved back to its original location
movedPiece = Home.getFurnitureSubList(frame.home.getSelectedItems()).get(0);
assertLocationAndOrientationEqualPiece(pieceX + 20 / planComponent.getScale(),
pieceY + 30 / planComponent.getScale(), selectedPiece.getAngle(), movedPiece);
assertLocationAndOrientationEqualPiece(pieceX, pieceY, selectedPiece.getAngle(), selectedPiece);
// Press Escape key
tester.actionKeyStroke(KeyEvent.VK_ESCAPE);
// Check no items where duplicated
assertTrue("Original items not selected", selectedItems.equals(frame.home.getSelectedItems()));
assertLocationAndOrientationEqualPiece(pieceX, pieceY, selectedPiece.getAngle(), selectedPiece);
assertEquals("New walls created", wallsCount, frame.home.getWalls().size());
assertEquals("New pieces created", furnitureCount, frame.home.getFurniture().size());
assertEquals("New dimension lines created", dimensionLinesCount, frame.home.getDimensionLines().size());
tester.actionMouseRelease();
// 22. Duplicate items
tester.actionMousePress(planComponent, new ComponentLocation(new Point(50, 170)));
tester.actionMouseMove(planComponent, new ComponentLocation(new Point(50, 190)));
tester.actionMouseRelease();
tester.actionKeyRelease(OperatingSystem.isMacOSX() ? KeyEvent.VK_ALT : KeyEvent.VK_CONTROL);
// Check the duplicated piece moved and the original piece didn't move
List<Selectable> movedItems = frame.home.getSelectedItems();
assertEquals("Selection doesn't contain 4 items", 4, movedItems.size());
movedPiece = Home.getFurnitureSubList(movedItems).get(0);
assertLocationAndOrientationEqualPiece(pieceX,
pieceY + 20 / planComponent.getScale(), selectedPiece.getAngle(), movedPiece);
assertLocationAndOrientationEqualPiece(pieceX, pieceY, selectedPiece.getAngle(), selectedPiece);
// Check the duplicated walls are joined to each other
List<Wall> movedWalls = Home.getWallsSubList(movedItems);
Wall movedWall1 = movedWalls.get(0);
Wall movedWall2 = movedWalls.get(1);