/*******************************************************************************
* Mission Control Technologies, Copyright (c) 2009-2012, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* The MCT platform is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* MCT includes source code licensed under additional open source licenses. See
* the MCT Open Source Licenses file included with this distribution or the About
* MCT Licenses dialog available at runtime from the MCT Help menu for additional
* information.
*******************************************************************************/
package gov.nasa.arc.mct.fastplot.bridge;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import gov.nasa.arc.mct.fastplot.bridge.PlotConstants.PanDirection;
import gov.nasa.arc.mct.fastplot.bridge.PlotConstants.ZoomDirection;
import gov.nasa.arc.mct.fastplot.view.Axis;
import gov.nasa.arc.mct.fastplot.view.IconLoader;
import gov.nasa.arc.mct.fastplot.view.PinSupport;
import gov.nasa.arc.mct.fastplot.view.Pinnable;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.geom.Rectangle2D;
import java.util.GregorianCalendar;
import javax.swing.SpringLayout;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import plotter.xy.XYPlot;
import plotter.xy.XYPlotContents;
public class TestPlotLocalControlsManager {
@Mock
private PlotterPlot mockPlot;
@Mock
private XYPlot plotView;
@Mock
private PlotCornerResetButtonManager cornerResetButtonManager;
private MyPanAndZoomManager panAndZoomManager;
PlotLocalControlsManager testLCM;
Rectangle2D rectangle;
@Mock
private PlotView plotAbstraction;
@Mock
private AbstractAxis mockAxis;
@Mock
private Axis otherAxis;
@BeforeMethod
public void setup() {
MockitoAnnotations.initMocks(this);
Mockito.when(mockPlot.getPlotView()).thenReturn(plotView);
Mockito.when(mockPlot.getTimeAxis()).thenReturn(mockAxis);
Mockito.when(mockPlot.getPlotAbstraction()).thenReturn(plotAbstraction);
Mockito.when(plotAbstraction.getTimeAxis()).thenReturn(otherAxis);
panAndZoomManager = new MyPanAndZoomManager(mockPlot);
mockPlot.panAndZoomManager = panAndZoomManager;
mockPlot.setPlotView(plotView);
mockPlot.cornerResetButtonManager = cornerResetButtonManager;
mockPlot.setPlotAbstraction(plotAbstraction);
mockPlot.setMaxTime(100);
mockPlot.setMinTime(0);
mockPlot.isLocalControlsEnabled = true;
mockPlot.isTimeLabelEnabled = true;
GregorianCalendar oneHundredCal = new GregorianCalendar();
oneHundredCal.setTimeInMillis(100);
GregorianCalendar zeroCal = new GregorianCalendar();
zeroCal.setTimeInMillis(0);
Mockito.when(mockPlot.isUserOperationsLocked()).thenReturn(false);
rectangle = new Rectangle(0,0,100,100);
final Axis timeAxis = new Axis();
final PinSupport pins = new PinSupport() {
Pinnable timeAxisPin = timeAxis.createPin();
@Override
protected void informPinned(boolean pinned) {
timeAxisPin.setPinned(pinned);
}
};
Mockito.when(plotAbstraction.getTimeAxis()).thenReturn(timeAxis);
Mockito.when(plotAbstraction.getTimeAxisUserPin()).thenReturn(pins.createPin());
Mockito.when(plotAbstraction.createPin()).thenAnswer(new Answer<Pinnable>() {
@Override
public Pinnable answer(InvocationOnMock invocation) throws Throwable {
return pins.createPin();
}
});
Mockito.when(plotView.getContents()).thenReturn(new XYPlotContents());
Mockito.when(plotView.getLayout()).thenReturn(new SpringLayout());
setTestLCM();
}
private void setTestLCM(){
testLCM = new PlotLocalControlsManager(mockPlot);
testLCM.setupLocalControlManager();
}
@Test
public void testPlotZoomButtons() {
// make sure the plot zoom buttons are connected to the right action.
Assert.assertNull(panAndZoomManager.lastZoomDirection);
ActionEvent e = new ActionEvent(testLCM, 0, "test action");
e.setSource(testLCM.xAxisCenterZoomInButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastZoomDirection, PlotConstants.ZoomDirection.ZOOM_IN_CENTER_X_AXIS);
e.setSource(testLCM.xAxisCenterZoomOutButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastZoomDirection, PlotConstants.ZoomDirection.ZOOM_OUT_CENTER_X_AXIS);
e.setSource(testLCM.yAxisCenterZoomInButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastZoomDirection, PlotConstants.ZoomDirection.ZOOM_IN_CENTER_Y_AXIS);
e.setSource(testLCM.yAxisCenterZoomOutButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastZoomDirection, PlotConstants.ZoomDirection.ZOOM_OUT_CENTER_Y_AXIS);
}
@Test
public void testPlotPanButtons() {
// make sure the pan buttons are connected to the right action.
Assert.assertNull(panAndZoomManager.lastPanDirection);
ActionEvent e = new ActionEvent(testLCM, 0, "test action");
e.setSource(testLCM.yAxisPanUpButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastPanDirection, PlotConstants.PanDirection.PAN_HIGHER_Y_AXIS);
e.setSource(testLCM.yAxisPanDownButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastPanDirection, PlotConstants.PanDirection.PAN_LOWER_Y_AXIS);
e.setSource(testLCM.xAxisPanLeftButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastPanDirection, PlotConstants.PanDirection.PAN_LOWER_X_AXIS);
e.setSource(testLCM.xAxisPanRightButton);
testLCM.actionPerformed(e);
Assert.assertEquals(panAndZoomManager.lastPanDirection, PlotConstants.PanDirection.PAN_HIGHER_X_AXIS);
}
@Test
public void testPauseButton() {
Axis timeAxis = mockPlot.getPlotAbstraction().getTimeAxis();
ActionEvent e = new ActionEvent(testLCM, 0, "test action");
e.setSource(testLCM.pauseButton);
testLCM.actionPerformed(e);
Assert.assertTrue(timeAxis.isPinned());
testLCM.actionPerformed(e);
Assert.assertFalse(timeAxis.isPinned());
}
@Test
public void testInformAltKeyState() {
panAndZoomManager.enteredZoomMode = false;
testLCM.informAltKeyState(true);
Assert.assertTrue(panAndZoomManager.enteredZoomMode);
Assert.assertTrue(testLCM.xAxisZoomButtonCenterPanel.isVisible());
Assert.assertTrue(testLCM.yAxisZoomButtonMiddlePanel.isVisible());
testLCM.informAltKeyState(false);
Assert.assertFalse(panAndZoomManager.enteredZoomMode);
Assert.assertFalse(testLCM.xAxisZoomButtonCenterPanel.isVisible());
Assert.assertFalse(testLCM.yAxisZoomButtonMiddlePanel.isVisible());
Mockito.when(mockPlot.isUserOperationsLocked()).thenReturn(true);
testLCM.informAltKeyState(true);
Assert.assertFalse(panAndZoomManager.enteredZoomMode);
Assert.assertFalse(testLCM.xAxisZoomButtonCenterPanel.isVisible());
Assert.assertFalse(testLCM.yAxisZoomButtonMiddlePanel.isVisible());
Mockito.when(mockPlot.isUserOperationsLocked()).thenReturn(false);
}
@Test
public void testInformCtlKeyState() {
panAndZoomManager.enteredPanMode = false;
testLCM.informCtlKeyState(true);
Assert.assertTrue(panAndZoomManager.enteredPanMode);
Assert.assertTrue(testLCM.xAxisPanButtonPanel.isVisible());
Assert.assertTrue(testLCM.yAxisPanButtonPanel.isVisible());
testLCM.informCtlKeyState(false);
Assert.assertFalse(panAndZoomManager.enteredPanMode);
Assert.assertFalse(testLCM.xAxisPanButtonPanel.isVisible());
Assert.assertFalse(testLCM.yAxisPanButtonPanel.isVisible());
Mockito.when(mockPlot.isUserOperationsLocked()).thenReturn(true);
testLCM.informCtlKeyState(true);
Assert.assertFalse(panAndZoomManager.enteredPanMode);
Assert.assertFalse(testLCM.xAxisPanButtonPanel.isVisible());
Assert.assertFalse(testLCM.yAxisPanButtonPanel.isVisible());
Mockito.when(mockPlot.isUserOperationsLocked()).thenReturn(false);
}
@Test
public void testMouseEnterAndExit() {
testLCM.pauseButton.setVisible(false);
Mockito.when(mockPlot.isPaused()).thenReturn(false);
testLCM.informMouseEntered();
Assert.assertTrue(testLCM.pauseButton.isVisible());
testLCM.informMouseExited();
Assert.assertFalse(testLCM.pauseButton.isVisible());
testLCM.informMouseEntered();
Assert.assertTrue(testLCM.pauseButton.isVisible());
Mockito.when(mockPlot.getPlotAbstraction().isPinned()).thenReturn(true);
testLCM.informMouseExited();
Assert.assertTrue(testLCM.pauseButton.isVisible());
}
@Test
public void testCornerResetButtons() {
ActionEvent e = new ActionEvent(testLCM, 0, "test action");
e.setSource(testLCM.topRightCornerResetButton);
testLCM.actionPerformed(e);
verify(cornerResetButtonManager).informJumpToCurrentTimeSelected();
verify(cornerResetButtonManager, never()).informResetYAxisActionSelected();
verify(cornerResetButtonManager, never()).informResetXAxisActionSelected();
verify(cornerResetButtonManager, never()).informResetXAndYActionSelected();
e.setSource(testLCM.topLeftCornerResetButton);
testLCM.actionPerformed(e);
verify(cornerResetButtonManager, atMost(1)).informJumpToCurrentTimeSelected();
verify(cornerResetButtonManager).informResetYAxisActionSelected();
verify(cornerResetButtonManager, never()).informResetXAxisActionSelected();
verify(cornerResetButtonManager, never()).informResetXAndYActionSelected();
e.setSource(testLCM.bottomRightCornerResetButton);
testLCM.actionPerformed(e);
verify(cornerResetButtonManager, atMost(1)).informJumpToCurrentTimeSelected();
verify(cornerResetButtonManager, atMost(1)).informResetYAxisActionSelected();
verify(cornerResetButtonManager).informResetXAxisActionSelected();
verify(cornerResetButtonManager, never()).informResetXAndYActionSelected();
e.setSource(testLCM. bottomLeftCornerResetButton);
testLCM.actionPerformed(e);
verify(cornerResetButtonManager, atMost(1)).informJumpToCurrentTimeSelected();
verify(cornerResetButtonManager, atMost(1)).informResetYAxisActionSelected();
verify(cornerResetButtonManager, atMost(1)).informResetXAxisActionSelected();
verify(cornerResetButtonManager).informResetXAndYActionSelected();
}
@Test
public void testSetButtonsVisible() {
testLCM. setJumpToCurrentTimeButtonVisible(true);
Assert.assertTrue(testLCM.topRightCornerResetButton.isVisible());
testLCM. setJumpToCurrentTimeButtonVisible(false);
Assert.assertFalse(testLCM.topRightCornerResetButton.isVisible());
testLCM.setXAxisCornerResetButtonVisible(true);
Assert.assertTrue(testLCM.bottomRightCornerResetButton.isVisible());
testLCM.setXAxisCornerResetButtonVisible(false);
Assert.assertFalse(testLCM.bottomRightCornerResetButton.isVisible());
testLCM.setYAxisCornerResetButtonVisible(true);
Assert.assertTrue(testLCM.topLeftCornerResetButton.isVisible());
testLCM.setYAxisCornerResetButtonVisible(false);
Assert.assertFalse(testLCM.topLeftCornerResetButton.isVisible());
testLCM.setXAndYAxisCornerResetButtonVisible(true);
Assert.assertTrue(testLCM.bottomLeftCornerResetButton.isVisible());
testLCM.setXAndYAxisCornerResetButtonVisible(false);
Assert.assertFalse(testLCM.bottomLeftCornerResetButton.isVisible());
}
@Test
public void testSetupUnPauseAndResetButtonVisible() {
testLCM.topRightCornerResetButton.setVisible(false);
testLCM.setJumpToCurrentTimeButtonVisible(true);
Assert.assertTrue(testLCM.topRightCornerResetButton.isVisible());
Assert.assertEquals(testLCM.topRightCornerResetButton.getIcon(),IconLoader.INSTANCE.getIcon(IconLoader.Icons.PLOT_CORNER_RESET_BUTTON_TOP_RIGHT_GREY));
testLCM.setJumpToCurrentTimeButtonVisible(false);
Assert.assertFalse(testLCM.topRightCornerResetButton.isVisible());
Assert.assertEquals(testLCM.topRightCornerResetButton.getIcon(),IconLoader.INSTANCE.getIcon(IconLoader.Icons.PLOT_CORNER_RESET_BUTTON_TOP_RIGHT_GREY));
testLCM.setJumpToCurrentTimeButtonAlarm(true);
Assert.assertTrue(testLCM.topRightCornerResetButton.isVisible());
Assert.assertEquals(testLCM.topRightCornerResetButton.getIcon(),IconLoader.INSTANCE.getIcon(IconLoader.Icons.PLOT_CORNER_RESET_BUTTON_TOP_RIGHT_ORANGE));
}
static private class MyPanAndZoomManager extends PanAndZoomManager {
// Accessed by test code.
PanDirection lastPanDirection = null;
ZoomDirection lastZoomDirection = null;
boolean enteredZoomMode = false;
boolean enteredPanMode = false;
public MyPanAndZoomManager(PlotterPlot quinnCurtisPlot) {
super(quinnCurtisPlot);
}
@Override
public void panAction(PanDirection panningAction) {
lastPanDirection = panningAction;
}
@Override
public void zoomAction(ZoomDirection zoomAction) {
lastZoomDirection = zoomAction;
}
@Override
public void enteredZoomMode() {
enteredZoomMode = true;
}
@Override
public void exitedZoomMode() {
enteredZoomMode = false;
}
@Override
public void enteredPanMode() {
enteredPanMode = true;
}
@Override
public void exitedPanMode() {
enteredPanMode = false;
}
@Override
public boolean isInPanMode() {
return enteredPanMode;
}
@Override
public boolean isInZoomMode() {
return enteredZoomMode;
}
}
}