001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.command;
017
018 import junit.framework.Assert;
019 import junit.framework.TestCase;
020
021 import org.easymock.EasyMock;
022 import org.springframework.richclient.application.PropertyNotSetException;
023 import org.springframework.richclient.command.config.CommandConfigurer;
024
025
026 /**
027 * Provides a suite of unit tests for the {@link CommandGroupFactoryBean} class.
028 *
029 * @author Kevin Stembridge
030 * @since 0.3
031 *
032 */
033 public class CommandGroupFactoryBeanTests extends TestCase {
034
035 private AbstractCommand noOpCommand = new AbstractCommand() {
036 public void execute() {
037 //do nothing
038 }
039
040 /**
041 * {@inheritDoc}
042 */
043 public String getId() {
044 return "noOpCommand";
045 }
046
047 };
048
049 private ToggleCommand toggleCommand = new ToggleCommand() {
050
051 /**
052 * {@inheritDoc}
053 */
054 public String getId() {
055 return "toggleCommand";
056 }
057
058 };
059
060 /**
061 * Creates a new uninitialized {@code CommandGroupFactoryBeanTests}.
062 */
063 public CommandGroupFactoryBeanTests() {
064 super();
065 }
066
067 /**
068 * Confirms that an exception is thrown from the afterPropertiesSet method if the
069 * encodedMembers property has not been set.
070 */
071 public void testForEncodedMembersNotSet() {
072
073 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean();
074
075 try {
076 factoryBean.afterPropertiesSet();
077 Assert.fail("Should have thrown a PropertyNotSetException");
078 }
079 catch (PropertyNotSetException e) {
080 Assert.assertEquals("members", e.getPropertyName());
081 }
082
083 }
084
085 /**
086 * Tests the constructor that takes the group id and members array.
087 * @throws Exception
088 */
089 public final void testConstructorTakingGroupIdAndMembersArray() throws Exception {
090
091 String groupId = "groupId";
092 Object[] members = null;
093
094 try {
095 new CommandGroupFactoryBean(groupId, members);
096 Assert.fail("Should have thrown an IllegalArgumentException");
097 }
098 catch(IllegalArgumentException e) {
099 //do nothing, test passes
100 }
101
102 members = new Object[] {noOpCommand};
103
104 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean(groupId, members);
105 CommandGroup commandGroup = (CommandGroup) factoryBean.getObject();
106 Assert.assertEquals(groupId, commandGroup.getId());
107 Assert.assertEquals(1, commandGroup.size());
108
109 }
110
111 /**
112 * Test method for {@link CommandGroupFactoryBean#setMembers(java.lang.Object[])}.
113 */
114 public final void testSetMembers() {
115
116 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean();
117
118 try {
119 factoryBean.setMembers(null);
120 Assert.fail("Should have thrown an IllegalArgumentException");
121 }
122 catch (IllegalArgumentException e) {
123 //test passes
124 }
125
126 factoryBean.setMembers(new Object[] {});
127
128 }
129
130 /**
131 * Test method for {@link org.springframework.richclient.command.CommandGroupFactoryBean#setBeanName(java.lang.String)}.
132 * @throws Exception
133 */
134 public final void testSetBeanName() throws Exception {
135
136 String groupId = "bogusGroupId";
137 String beanName = "bogusBeanName";
138 Object[] members = new Object[] {noOpCommand};
139
140 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean(groupId, members);
141 CommandGroup commandGroup = (CommandGroup) factoryBean.getObject();
142 Assert.assertEquals(groupId, commandGroup.getId());
143
144 //confirm that setting the beanName will override the groupId
145 factoryBean = new CommandGroupFactoryBean(groupId, members);
146 factoryBean.setBeanName(beanName);
147 commandGroup = (CommandGroup) factoryBean.getObject();
148 Assert.assertEquals(beanName, commandGroup.getId());
149
150 }
151
152 /**
153 * Confirms that an exception is thrown if the 'group:' prefix appears in the members list
154 * with no following command name.
155 */
156 public void testInvalidGroupPrefix() {
157
158 Object[] members = new Object[] {CommandGroupFactoryBean.GROUP_MEMBER_PREFIX};
159
160 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean();
161 factoryBean.setMembers(members);
162
163 try {
164 factoryBean.getCommandGroup();
165 Assert.fail("Should have thrown an InvalidGroupMemberEncodingException");
166 }
167 catch (InvalidGroupMemberEncodingException e) {
168 Assert.assertEquals(CommandGroupFactoryBean.GROUP_MEMBER_PREFIX, e.getEncodedString());
169 }
170
171 }
172
173 /**
174 * Confirms that an exception is thrown if the 'command:' prefix appears in the members list
175 * with no following command name.
176 */
177 public void testInvalidCommandPrefix() {
178
179 Object[] members = new Object[] {CommandGroupFactoryBean.COMMAND_MEMBER_PREFIX};
180
181 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean();
182 factoryBean.setMembers(members);
183
184 try {
185 factoryBean.getCommandGroup();
186 Assert.fail("Should have thrown an InvalidGroupMemberEncodingException");
187 }
188 catch (InvalidGroupMemberEncodingException e) {
189 Assert.assertEquals(CommandGroupFactoryBean.COMMAND_MEMBER_PREFIX, e.getEncodedString());
190 }
191
192 }
193
194 /**
195 * Test method for {@link CommandGroupFactoryBean#createCommandGroup()}.
196 * @throws Exception
197 */
198 public final void testCreateCommandGroup() throws Exception {
199
200 String groupId = "bogusGroupId";
201 String securityId = "bogusSecurityId";
202 Object[] members = new Object[] {toggleCommand};
203
204 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean(groupId, members);
205 factoryBean.setSecurityControllerId(securityId);
206 CommandGroup commandGroup = (CommandGroup) factoryBean.getObject();
207 Assert.assertEquals(securityId , commandGroup.getSecurityControllerId());
208 Assert.assertFalse("Assert command group not exclusive", commandGroup instanceof ExclusiveCommandGroup);
209 Assert.assertEquals(1, commandGroup.size());
210
211 factoryBean = new CommandGroupFactoryBean(groupId, members);
212 factoryBean.setExclusive(true);
213 factoryBean.setAllowsEmptySelection(true);
214 commandGroup = (CommandGroup) factoryBean.getObject();
215 Assert.assertTrue("Assert command group is exclusive", commandGroup instanceof ExclusiveCommandGroup);
216 Assert.assertTrue("Assert allows empty selection is true",
217 ((ExclusiveCommandGroup) commandGroup).getAllowsEmptySelection());
218
219
220 }
221
222 /**
223 * Test method for {@link CommandGroupFactoryBean#configureIfNecessary(AbstractCommand)}.
224 */
225 public final void testConfigureIfNecessary() {
226
227 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean();
228
229 try {
230 factoryBean.configureIfNecessary(null);
231 Assert.fail("Should have thrown an IllegalArgumentException");
232 }
233 catch (IllegalArgumentException e) {
234 //test passes
235 }
236
237 AbstractCommand command = new AbstractCommand() {
238 public void execute() {
239 //do nothing
240 }
241 };
242
243 //no configurer has been set, confirming that this doesn't throw an exception
244 factoryBean.configureIfNecessary(command);
245
246 CommandConfigurer configurer = (CommandConfigurer) EasyMock.createMock(CommandConfigurer.class);
247 EasyMock.expect(configurer.configure(command)).andReturn(command);
248
249 EasyMock.replay(configurer);
250
251 factoryBean.setCommandConfigurer(configurer);
252 factoryBean.configureIfNecessary(command);
253
254 EasyMock.verify(configurer);
255
256 }
257
258 /**
259 * Test method for {@link CommandGroupFactoryBean#getObjectType()}.
260 */
261 public final void testGetObjectType() {
262 Assert.assertEquals(CommandGroup.class, new CommandGroupFactoryBean().getObjectType());
263 }
264
265 /**
266 * Confirms that the command group is assigned the security controller id of the factory bean.
267 * @throws Exception
268 */
269 public final void testSecurityControllerIdIsApplied() throws Exception {
270
271 String groupId = "bogusGroupId";
272 String securityId = "bogusSecurityId";
273 Object[] members = new Object[] {noOpCommand};
274
275 CommandGroupFactoryBean factoryBean = new CommandGroupFactoryBean(groupId, members);
276 factoryBean.setSecurityControllerId(securityId);
277 CommandGroup commandGroup = (CommandGroup) factoryBean.getObject();
278 Assert.assertEquals(securityId , commandGroup.getSecurityControllerId());
279
280 }
281
282 }