001 package org.springframework.richclient.command.support;
002
003 import javax.swing.AbstractButton;
004
005 import org.springframework.binding.value.support.EqualsValueChangeDetector;
006 import org.springframework.richclient.application.ApplicationServicesLocator;
007 import org.springframework.richclient.application.config.ApplicationObjectConfigurer;
008 import org.springframework.richclient.application.support.DefaultApplicationServices;
009 import org.springframework.richclient.command.AbstractCommand;
010 import org.springframework.richclient.command.config.CommandFaceDescriptor;
011 import org.springframework.richclient.test.SpringRichTestCase;
012
013
014 public class ButtonTests extends SpringRichTestCase
015 {
016
017 /**
018 * May be implemented in subclasses that need to register services with the global
019 * application services instance.
020 */
021 protected void registerAdditionalServices( DefaultApplicationServices applicationServices ) {
022 applicationServices.setValueChangeDetector(new EqualsValueChangeDetector());
023 }
024
025 public void testButtonEnabling()
026 {
027 TestCommand testCommand = new TestCommand();
028 AbstractButton button = testCommand.createButton();
029 AbstractButton button2 = testCommand.createButton();
030 enableTests(testCommand, new Object[]{button, button2});
031 }
032
033 public void enableTests(AbstractCommand command, Object[] buttons)
034 {
035 enableTest(command, buttons, false);
036 enableTest(command, buttons, true);
037 }
038
039 public void enableTest(AbstractCommand command, Object[] buttons, boolean enable)
040 {
041 command.setEnabled(enable);
042 assertEquals(command.isEnabled(), enable);
043 for (int i = 0; i < buttons.length; ++i)
044 {
045 assertEquals(enable, ((AbstractButton)buttons[i]).isEnabled());
046 }
047 }
048
049 public void testButtonVisible()
050 {
051 TestCommand testCommand = new TestCommand();
052 AbstractButton button = testCommand.createButton();
053 AbstractButton button2 = testCommand.createButton();
054 visibleTests(testCommand, new Object[]{button, button2});
055 }
056
057 public void visibleTests(AbstractCommand command, Object[] buttons)
058 {
059 enableTest(command, buttons, false);
060 enableTest(command, buttons, true);
061 }
062
063 public void visibleTest(AbstractCommand command, Object[] buttons, boolean visible)
064 {
065 command.setVisible(visible);
066 assertEquals(command.isVisible(), visible);
067 for (int i = 0; i < buttons.length; ++i)
068 {
069 assertEquals(visible, ((AbstractButton)buttons[i]).isVisible());
070 }
071 }
072
073 // testing different sequences because error was in sequence of hashmap:
074 public void testMultipleFaceDescriptorsEnabling()
075 {
076 multipleFaceDescriptorSequence("face1", "face2", "face3");
077 multipleFaceDescriptorSequence("face1", "face3", "face2");
078
079 multipleFaceDescriptorSequence("face2", "face1", "face3");
080 multipleFaceDescriptorSequence("face2", "face3", "face1");
081
082 multipleFaceDescriptorSequence("face3", "face2", "face1");
083 multipleFaceDescriptorSequence("face3", "face1", "face2");
084 }
085
086 private void multipleFaceDescriptorSequence(String face1, String face2, String face3)
087 {
088 TestCommand testCommand = new TestCommand();
089 registerCommandFaceDescriptor(face1, testCommand);
090 registerCommandFaceDescriptor(face2, testCommand);
091 registerCommandFaceDescriptor(face3, testCommand);
092
093 AbstractButton face1button = testCommand.createButton(face1);
094 enableTests(testCommand, new Object[]{face1button});
095
096 AbstractButton face2button = testCommand.createButton(face2);
097 enableTests(testCommand, new Object[]{face1button, face2button});
098
099 AbstractButton face3button = testCommand.createButton(face3);
100 enableTests(testCommand, new Object[]{face1button, face2button, face3button});
101 }
102
103 private void registerCommandFaceDescriptor(String faceId, AbstractCommand command)
104 {
105 CommandFaceDescriptor face = new CommandFaceDescriptor();
106 ApplicationObjectConfigurer configurer = (ApplicationObjectConfigurer)ApplicationServicesLocator.services().getService(ApplicationObjectConfigurer.class);
107 configurer.configure(face, faceId);
108 command.setFaceDescriptor(faceId, face);
109 }
110
111 /**
112 * Tests if a command subclass can use an additional condition when enable is enabled or not
113 * @throws Exception
114 */
115 public void testAdditionalConditionToEnable() throws Exception {
116 AdditionalStateTestCommand testCommand = new AdditionalStateTestCommand();
117 AbstractButton button = testCommand.createButton();
118 assertEquals(testCommand.isEnabled(), button.isEnabled());
119 testCommand.setMyenabledState(false);
120 assertEquals(false, testCommand.isEnabled());
121 assertEquals(testCommand.isEnabled(), button.isEnabled());
122 testCommand.setMyenabledState(true);
123 assertEquals(true, testCommand.isEnabled());
124 assertEquals(testCommand.isEnabled(), button.isEnabled());
125 }
126
127 /**
128 * Tests if a command subclass can use an additional condition when visible is enabled or not
129 * @throws Exception
130 */
131 public void testAdditionalConditionToVisible() throws Exception {
132 AdditionalStateTestCommand testCommand = new AdditionalStateTestCommand();
133 AbstractButton button = testCommand.createButton();
134 assertEquals(testCommand.isVisible(), button.isVisible());
135 testCommand.setMyvisibleState(false);
136 assertEquals(false, testCommand.isVisible());
137 assertEquals(testCommand.isVisible(), button.isVisible());
138 testCommand.setMyvisibleState(true);
139 assertEquals(true, testCommand.isVisible());
140 assertEquals(testCommand.isVisible(), button.isVisible());
141 }
142 }