package utest.common; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Point; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.net.URL; import javax.swing.JFrame; import org.fest.assertions.Assertions; 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.CommandToggleButtonGroup; import org.pushingpixels.flamingo.api.common.JCommandToggleButton; import org.pushingpixels.flamingo.api.common.icon.ResizableIcon; import org.pushingpixels.flamingo.api.svg.SvgBatikResizableIcon; public class CommandToggleButtonGroupTestCase extends FestSwingJUnitTestCase { JFrame buttonFrame; final static int COUNT = 3; JCommandToggleButton[] buttons; CommandToggleButtonGroup group; int propertyChangeCount; PropertyChangeListener propertyChangeListener; @Override @Before public void onSetUp() { String[] iconNames = new String[] { "paste", "copy", "cut" }; final ResizableIcon[] icons = new ResizableIcon[COUNT]; for (int i = 0; i < COUNT; i++) { URL iconUrl = CommandToggleButtonGroupTestCase.class .getClassLoader().getResource( "utest/common/edit-" + iconNames[i] + ".svg"); Assertions.assertThat(iconUrl).isNotNull(); icons[i] = SvgBatikResizableIcon.getSvgIcon(iconUrl, new Dimension( 32, 32)); } Pause.pause(new Condition("Waiting to load the SVG icons") { @Override public boolean test() { for (int i = 0; i < COUNT; i++) { if (((AsynchronousLoading) icons[i]).isLoading()) return false; } return true; } }); GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttonFrame = new JFrame(); buttonFrame.setLayout(new FlowLayout()); propertyChangeCount = 0; group = new CommandToggleButtonGroup(); buttons = new JCommandToggleButton[COUNT]; for (int i = 0; i < COUNT; i++) { buttons[i] = new JCommandToggleButton("test" + i, icons[i]); buttons[i].setDisplayState(CommandButtonDisplayState.BIG); group.add(buttons[i]); buttonFrame.add(buttons[i]); } 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 buttonActivationWithMouse() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); for (int i = 0; i < COUNT; i++) { final int indexToSelect = i; robot().click(buttons[indexToSelect]); robot().waitForIdle(); Assertions.assertThat( GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[i]); for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel() .isSelected(); } })).isEqualTo(indexToSelect == index); } } } @Test public void buttonActivationWithAPI() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); for (int i = 0; i < COUNT; i++) { final int indexToSelect = i; GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[indexToSelect].getActionModel().setSelected(true); } }); robot().waitForIdle(); Assertions.assertThat( GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[i]); for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel() .isSelected(); } })).isEqualTo(indexToSelect == index); } } } @Test public void buttonActivationWithGroupAPI() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); for (int i = 0; i < COUNT; i++) { final int indexToSelect = i; GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.setSelected(buttons[indexToSelect], true); } }); robot().waitForIdle(); Assertions.assertThat( GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[indexToSelect]); for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel() .isSelected(); } })).isEqualTo(indexToSelect == index); } } } @Test public void addUnselectedButtonWithNoPreviousSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // create a new button URL cutIconUrl = CommandToggleButtonTestCase.class.getClassLoader() .getResource("utest/common/edit-cut.svg"); Assertions.assertThat(cutIconUrl).isNotNull(); final ResizableIcon cutIcon = SvgBatikResizableIcon.getSvgIcon( cutIconUrl, new Dimension(16, 16)); Pause.pause(new Condition("Waiting to load the SVG icon") { @Override public boolean test() { return !((AsynchronousLoading) cutIcon).isLoading(); } }); final JCommandToggleButton newButton = GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { JCommandToggleButton result = new JCommandToggleButton( "new button", cutIcon); result.setDisplayState(CommandButtonDisplayState.BIG); buttonFrame.add(result); buttonFrame.invalidate(); buttonFrame.validate(); return result; } }); robot().waitForIdle(); // add the button to the button group GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.add(newButton); } }); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the newly added button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { newButton.getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(newButton); // all other buttons should be unselected for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } } @Test public void addUnselectedButtonWithPreviousSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // create a new button URL cutIconUrl = CommandToggleButtonTestCase.class.getClassLoader() .getResource("utest/common/edit-cut.svg"); Assertions.assertThat(cutIconUrl).isNotNull(); final ResizableIcon cutIcon = SvgBatikResizableIcon.getSvgIcon( cutIconUrl, new Dimension(16, 16)); Pause.pause(new Condition("Waiting to load the SVG icon") { @Override public boolean test() { return !((AsynchronousLoading) cutIcon).isLoading(); } }); final JCommandToggleButton newButton = GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { JCommandToggleButton result = new JCommandToggleButton( "new button", cutIcon); result.setDisplayState(CommandButtonDisplayState.BIG); buttonFrame.add(result); buttonFrame.invalidate(); buttonFrame.validate(); return result; } }); robot().waitForIdle(); // add the button to the button group GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.add(newButton); } }); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // select the newly added button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { newButton.getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(newButton); // all other buttons should be unselected for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } } @Test public void addSelectedButtonWithNoPreviousSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // create a new button URL cutIconUrl = CommandToggleButtonTestCase.class.getClassLoader() .getResource("utest/common/edit-cut.svg"); Assertions.assertThat(cutIconUrl).isNotNull(); final ResizableIcon cutIcon = SvgBatikResizableIcon.getSvgIcon( cutIconUrl, new Dimension(16, 16)); Pause.pause(new Condition("Waiting to load the SVG icon") { @Override public boolean test() { return !((AsynchronousLoading) cutIcon).isLoading(); } }); final JCommandToggleButton newButton = GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { JCommandToggleButton result = new JCommandToggleButton( "new button", cutIcon); result.getActionModel().setSelected(true); result.setDisplayState(CommandButtonDisplayState.BIG); buttonFrame.add(result); buttonFrame.invalidate(); buttonFrame.validate(); return result; } }); robot().waitForIdle(); // add the button to the button group GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.add(newButton); } }); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(newButton); // all other buttons should be unselected for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // all other buttons should be unselected for (int j = 1; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return newButton.getActionModel().isSelected(); } })).isFalse(); } @Test public void addSelectedButtonWithPreviousSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // create a new button URL cutIconUrl = CommandToggleButtonTestCase.class.getClassLoader() .getResource("utest/common/edit-cut.svg"); Assertions.assertThat(cutIconUrl).isNotNull(); final ResizableIcon cutIcon = SvgBatikResizableIcon.getSvgIcon( cutIconUrl, new Dimension(16, 16)); Pause.pause(new Condition("Waiting to load the SVG icon") { @Override public boolean test() { return !((AsynchronousLoading) cutIcon).isLoading(); } }); final JCommandToggleButton newButton = GuiActionRunner .execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { JCommandToggleButton result = new JCommandToggleButton( "new button", cutIcon); result.getActionModel().setSelected(true); result.setDisplayState(CommandButtonDisplayState.BIG); buttonFrame.add(result); buttonFrame.invalidate(); buttonFrame.validate(); return result; } }); robot().waitForIdle(); // add the button to the button group GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.add(newButton); } }); // check that the group selection is still remains Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // all other buttons should be unselected for (int j = 1; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return newButton.getActionModel().isSelected(); } })).isFalse(); // select the newly added button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { newButton.getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(newButton); Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return newButton.getActionModel().isSelected(); } })).isTrue(); // all other buttons should be unselected for (int j = 0; j < COUNT; j++) { final int index = j; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } } @Test public void removeSelectedButton() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // remove the selected button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.remove(buttons[0]); } }); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // the first button should still be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // and the rest of the buttons should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isFalse(); Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); // select the second button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[1].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[1]); // the first button should still be selected - it's not in the group Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // the second button should be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isTrue(); // and the third button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); } @Test public void removeUnselectedButtonFromGroupWithSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // remove the second (unselected) button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.remove(buttons[1]); } }); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // the first button should still be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // and the rest of the buttons should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isFalse(); Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); // select the second button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[1].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // the first button should still be selected - since the // second button is not in the group Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // the second button should be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isTrue(); // and the third button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); } @Test public void removeUnselectedButtonFromGroupWithNoSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // remove the second button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.remove(buttons[1]); } }); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // none of the buttons should be selected for (int i = 0; i < COUNT; i++) { final int index = i; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } // select the second and third button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[1].getActionModel().setSelected(true); buttons[2].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[2]); // the first button should not be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isFalse(); // the second button should be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isTrue(); // and the third button should be selected - since the second button // is not part of the group Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isTrue(); } @Test public void clearSelection() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // clear the selection GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.clearSelection(); } }); robot().waitForIdle(); // none of the buttons should be selected for (int i = 0; i < COUNT; i++) { final int index = i; Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[index].getActionModel().isSelected(); } })).isFalse(); } // select the second button and remove it. // also select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[1].getActionModel().setSelected(true); group.remove(buttons[1]); buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // the first button should be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // the second button should be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isTrue(); // and the third button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); // clear the selection GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.clearSelection(); } }); robot().waitForIdle(); // the first button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isFalse(); // the second button should still be selected - it's not part // of the group Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isTrue(); // and the third button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); } @Test public void clickSelectedButton() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // click the first button robot().click(buttons[0]); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // click the first button once again robot().click(buttons[0]); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(null); for (int i = 0; i <= 2; i++) { final int fi = i; // the button should be unselected Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[fi].getActionModel().isSelected(); } })).isFalse(); } } @Test public void clickSelectedButtonWhenClearingSelectionIsNotAllowed() { group.setAllowsClearingSelection(false); // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // click the first button robot().click(buttons[0]); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // click the first button once again robot().click(buttons[0]); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // the first button should still be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // the second button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isFalse(); // and the third button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); } @Test public void clearSelectionWhenClearingSelectionIsNotAllowed() { group.setAllowsClearingSelection(false); // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // click the first button robot().click(buttons[0]); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // clear the selection GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.clearSelection(); } }); robot().waitForIdle(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // the first button should still be selected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[0].getActionModel().isSelected(); } })).isTrue(); // the second button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[1].getActionModel().isSelected(); } })).isFalse(); // and the third button should be unselected Assertions.assertThat(GuiActionRunner.execute(new GuiQuery<Boolean>() { @Override protected Boolean executeInEDT() throws Throwable { return buttons[2].getActionModel().isSelected(); } })).isFalse(); } @Test public void propertyChangeListener() { // no selection Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // no property change listeners have been notified Assertions.assertThat(propertyChangeCount).isZero(); // register a property change listener GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { propertyChangeListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (CommandToggleButtonGroup.SELECTED_PROPERTY .equals(evt.getPropertyName())) { propertyChangeCount++; } } }; group.addPropertyChangeListener(propertyChangeListener); } }); robot().waitForIdle(); // no property change listeners have been notified Assertions.assertThat(propertyChangeCount).isZero(); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // select the second button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[1].getActionModel().setSelected(true); } }); robot().waitForIdle(); // property change listeners should have been notified Assertions.assertThat(propertyChangeCount).isEqualTo(1); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[1]); // clear the selection GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.clearSelection(); } }); robot().waitForIdle(); // property change listeners should have been notified Assertions.assertThat(propertyChangeCount).isEqualTo(2); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isNull(); // select the first button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[0].getActionModel().setSelected(true); } }); robot().waitForIdle(); // property change listeners should have been notified Assertions.assertThat(propertyChangeCount).isEqualTo(3); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // unregister the property change listener GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.removePropertyChangeListener(propertyChangeListener); } }); robot().waitForIdle(); // no property change listeners have been notified Assertions.assertThat(propertyChangeCount).isEqualTo(3); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[0]); // select the second button GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { buttons[1].getActionModel().setSelected(true); } }); robot().waitForIdle(); // no property change listeners should have been notified Assertions.assertThat(propertyChangeCount).isEqualTo(3); // check that the group selection is correct Assertions.assertThat( GuiActionRunner.execute(new GuiQuery<JCommandToggleButton>() { @Override protected JCommandToggleButton executeInEDT() throws Throwable { return group.getSelected(); } })).isEqualTo(buttons[1]); // clear the selection GuiActionRunner.execute(new GuiTask() { @Override protected void executeInEDT() throws Throwable { group.clearSelection(); } }); robot().waitForIdle(); // no property change listeners should have been notified Assertions.assertThat(propertyChangeCount).isEqualTo(3); } }