package utest.common;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.net.URL;
import javax.swing.JFrame;
import org.fest.assertions.Assertions;
import org.fest.swing.awt.AWT;
import org.fest.swing.edt.GuiActionRunner;
import org.fest.swing.edt.GuiQuery;
import org.fest.swing.edt.GuiTask;
import org.fest.swing.junit.testcase.FestSwingJUnitTestCase;
import org.fest.swing.timing.Condition;
import org.fest.swing.timing.Pause;
import org.junit.Before;
import org.junit.Test;
import org.pushingpixels.flamingo.api.common.AsynchronousLoading;
import org.pushingpixels.flamingo.api.common.CommandButtonDisplayState;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.JCommandButton.CommandButtonKind;
import org.pushingpixels.flamingo.api.common.JCommandMenuButton;
import org.pushingpixels.flamingo.api.common.icon.EmptyResizableIcon;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu;
import org.pushingpixels.flamingo.api.common.popup.JPopupPanel;
import org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback;
import org.pushingpixels.flamingo.api.svg.SvgBatikResizableIcon;
public class SplitCommandButtonTestCase extends FestSwingJUnitTestCase {
JFrame buttonFrame;
JCommandButton button;
StringBuffer stringBuffer;
JCommandMenuButton[] menuButtons;
final static int MENU_BUTTON_COUNT = 5;
int count;
@Override
@Before
public void onSetUp() {
URL resource = SplitCommandButtonTestCase.class.getClassLoader()
.getResource("utest/common/edit-paste.svg");
Assertions.assertThat(resource).isNotNull();
final ResizableIcon icon = SvgBatikResizableIcon.getSvgIcon(resource,
new Dimension(32, 32));
Pause.pause(new Condition("Waiting to load the SVG icon") {
@Override
public boolean test() {
return !((AsynchronousLoading) icon).isLoading();
}
});
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
stringBuffer = new StringBuffer();
count = 0;
buttonFrame = new JFrame();
button = new JCommandButton("test", icon);
button.setDisplayState(CommandButtonDisplayState.BIG);
button
.setCommandButtonKind(CommandButtonKind.ACTION_AND_POPUP_MAIN_ACTION);
button.setPopupCallback(new PopupPanelCallback() {
@Override
public JPopupPanel getPopupPanel(
JCommandButton commandButton) {
JCommandPopupMenu result = new JCommandPopupMenu();
menuButtons = new JCommandMenuButton[MENU_BUTTON_COUNT];
for (int i = 0; i < MENU_BUTTON_COUNT; i++) {
final int index = i;
menuButtons[i] = new JCommandMenuButton("popup "
+ i, new EmptyResizableIcon(16));
menuButtons[i]
.addActionListener(new ActionListener() {
@Override
public void actionPerformed(
ActionEvent e) {
stringBuffer.append(index);
}
});
result.addMenuButton(menuButtons[i]);
}
return result;
}
});
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
count++;
}
});
buttonFrame.setLayout(new FlowLayout());
buttonFrame.add(button);
buttonFrame.setSize(300, 200);
buttonFrame.setLocationRelativeTo(null);
buttonFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
buttonFrame.setVisible(true);
}
});
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
Point locOnScreen = buttonFrame.getLocationOnScreen();
locOnScreen.move(10, 20);
robot().moveMouse(locOnScreen);
}
});
}
@Test
public void activateActionWithMouse() {
Rectangle actionClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().actionClickArea;
};
});
// click the action area
robot().click(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
// check that the action listener has been invoked
Assertions.assertThat(count).isEqualTo(1);
// check that the popup is not showing
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
}
@Test
public void activateActionWithSpace() {
Rectangle actionClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().actionClickArea;
};
});
Assertions.assertThat(actionClickArea).isNotNull();
robot().moveMouse(button, AWT.centerOf(actionClickArea));
robot().pressAndReleaseKeys(KeyEvent.VK_SPACE);
robot().waitForIdle();
// check that the action listener has been invoked
Assertions.assertThat(count).isEqualTo(1);
// check that the popup is not showing
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
}
@Test
public void activateActionWithAPI() {
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.doActionClick();
}
});
robot().waitForIdle();
Assertions.assertThat(count).isEqualTo(1);
}
@Test
public void activatePopupWithMouse() {
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
Assertions.assertThat(popupClickArea).isNotNull();
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// popup should be showing
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void activatePopupWithAPI() {
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.doPopupClick();
}
});
robot().waitForIdle();
// popup should be showing
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
}
@Test
public void dismissPopupByClickingOutsideTheButton() {
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// popup should be showing
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
// move the mouse away from the button
robot().moveMouse(button, new Point(-10, 10));
robot().waitForIdle();
// popup should still be visible
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
// click away from the button
robot().click(button, new Point(-10, 10));
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void dismissPopupByClickingTheButton() {
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
Assertions.assertThat(popupClickArea).isNotNull();
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// popup should be showing
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
// click the popup area one more time
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void clickTheFirstMenuButton() {
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
Assertions.assertThat(popupClickArea).isNotNull();
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return menuButtons[0].isVisible();
}
})).isTrue();
robot().click(menuButtons[0]);
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// check that the menu button has been clicked
Assertions.assertThat(stringBuffer.toString()).isEqualTo("0");
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void clickTheFirstAndSecondMenuButton() {
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
// click the popup area
Assertions.assertThat(popupClickArea).isNotNull();
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return menuButtons[0].isVisible();
}
})).isTrue();
robot().click(menuButtons[0]);
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// check that the menu button has been clicked
Assertions.assertThat(stringBuffer.toString()).isEqualTo("0");
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return menuButtons[1].isVisible();
}
})).isTrue();
robot().click(menuButtons[1]);
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// check that the menu button has been clicked
Assertions.assertThat(stringBuffer.toString()).isEqualTo("01");
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void clickAllMenuButtons() {
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
Assertions.assertThat(popupClickArea).isNotNull();
for (int i = 0; i < MENU_BUTTON_COUNT; i++) {
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
final int index = i;
Assertions.assertThat(
GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return menuButtons[index].isVisible();
}
})).isTrue();
robot().click(menuButtons[i]);
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(
GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
}
String expected = "";
for (int i = 0; i < MENU_BUTTON_COUNT; i++) {
expected += i;
}
// check that the menu buttons have been clicked
Assertions.assertThat(stringBuffer.toString()).isEqualTo(expected);
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void checkPopupDisable() {
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getPopupModel().setEnabled(false);
}
});
robot().waitForIdle();
// popup should be disabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isEnabled();
}
})).isFalse();
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// now enable the popup
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getPopupModel().setEnabled(true);
}
});
robot().waitForIdle();
// popup should be enabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isEnabled();
}
})).isTrue();
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// popup should be shown
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
// and no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void checkActionDisable() {
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getActionModel().setEnabled(false);
}
});
robot().waitForIdle();
// action should be disabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getActionModel().isEnabled();
}
})).isFalse();
Rectangle actionClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().actionClickArea;
};
});
// click the action area
robot().click(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
// no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
// and popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// now enable the action
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getActionModel().setEnabled(true);
}
});
robot().waitForIdle();
// action should be enabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getActionModel().isEnabled();
}
})).isTrue();
// click the action area
robot().click(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
// action listener should have been invoked
Assertions.assertThat(count).isEqualTo(1);
// and popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
}
@Test
public void checkActionAndPopupDisable() {
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getActionModel().setEnabled(false);
button.getPopupModel().setEnabled(false);
}
});
robot().waitForIdle();
// action should be disabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getActionModel().isEnabled();
}
})).isFalse();
// popup should be disabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isEnabled();
}
})).isFalse();
Rectangle actionClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().actionClickArea;
};
});
Rectangle popupClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().popupClickArea;
};
});
// click the action area
robot().click(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
// no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
// and popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// click the popup area
robot().click(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
// no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
// and popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// now enable the action and popup
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getActionModel().setEnabled(true);
button.getPopupModel().setEnabled(true);
}
});
robot().waitForIdle();
// action should be enabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getActionModel().isEnabled();
}
})).isTrue();
// popup should be enabled
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isEnabled();
}
})).isTrue();
// click the action area
robot().click(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
// action listener should have been invoked
Assertions.assertThat(count).isEqualTo(1);
// and popup should be hidden
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isFalse();
// click the popup area
robot().click(button, AWT.centerOf(popupClickArea));
robot().waitForIdle();
// no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(1);
// and popup should be shown
Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() {
@Override
protected Boolean executeInEDT() throws Throwable {
return button.getPopupModel().isPopupShowing();
}
})).isTrue();
}
@Test
public void pressButtonAndDisableBeforeRelease() {
Rectangle actionClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().actionClickArea;
};
});
Assertions.assertThat(actionClickArea).isNotNull();
robot().pressMouse(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
GuiActionRunner.execute(new GuiTask() {
@Override
protected void executeInEDT() throws Throwable {
button.getActionModel().setEnabled(false);
}
});
robot().releaseMouseButtons();
robot().waitForIdle();
// no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
@Test
public void pressButtonAndMoveAwayBeforeRelease() {
Rectangle actionClickArea = GuiActionRunner
.execute(new GuiQuery<Rectangle>() {
@Override
protected Rectangle executeInEDT() throws Throwable {
return button.getUI().getLayoutInfo().actionClickArea;
};
});
Assertions.assertThat(actionClickArea).isNotNull();
robot().pressMouse(button, AWT.centerOf(actionClickArea));
robot().waitForIdle();
robot().moveMouse(button, new Point(-10, 10));
robot().waitForIdle();
robot().releaseMouseButtons();
robot().waitForIdle();
// no action listener should have been invoked
Assertions.assertThat(count).isEqualTo(0);
}
}