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.config;
017    
018    import java.awt.event.KeyEvent;
019    import java.util.HashMap;
020    import java.util.Iterator;
021    import java.util.Map;
022    
023    import javax.swing.JButton;
024    import javax.swing.JMenuItem;
025    import javax.swing.KeyStroke;
026    
027    import junit.framework.Assert;
028    import junit.framework.TestCase;
029    
030    import org.springframework.richclient.core.LabelInfo;
031    
032    /**
033     * @author Peter De Bruycker
034     * @author Kevin Stembridge
035     */
036    public class CommandButtonLabelInfoTests extends TestCase {
037    
038        private LabelInfo labelInfo;
039    
040        private KeyStroke accelerator;
041        
042        private Map invalidLabelDescriptors;
043    
044        public static void pass() {
045            // test passes
046        }
047        
048        /**
049         * Creates a new {@code LabelInfoTests}.
050         */
051        public CommandButtonLabelInfoTests() {
052            this.invalidLabelDescriptors = new HashMap();
053            this.invalidLabelDescriptors.put("@", "An @ symbol must be followed by a KeyStroke.");
054            this.invalidLabelDescriptors.put("Test@Bogus", "Invalid KeyStroke format.");
055        }
056    
057        /**
058         * @see junit.framework.TestCase#setUp()
059         */
060        protected void setUp() throws Exception {
061            super.setUp();
062            labelInfo = new LabelInfo("Test", 'T', 3);
063            accelerator = KeyStroke.getKeyStroke("ctrl T");
064    
065            // make sure the keystroke did get parsed
066            assertNotNull(accelerator);
067        }
068    
069        public void testConstructorLabelInfo() {
070            CommandButtonLabelInfo info = new CommandButtonLabelInfo(labelInfo, accelerator);
071    
072            assertEquals(labelInfo.getText(), info.getText());
073            assertEquals(labelInfo.getMnemonic(), info.getMnemonic());
074            assertEquals(labelInfo.getMnemonicIndex(), info.getMnemonicIndex());
075            assertEquals(accelerator, info.getAccelerator());
076        }
077    
078        public void testConstructorLabelInfoNoAccelerator() {
079            CommandButtonLabelInfo info = new CommandButtonLabelInfo(labelInfo, null);
080    
081            assertEquals(labelInfo.getText(), info.getText());
082            assertEquals(labelInfo.getMnemonic(), info.getMnemonic());
083            assertEquals(labelInfo.getMnemonicIndex(), info.getMnemonicIndex());
084            assertNull(info.getAccelerator());
085        }
086    
087        public void testConstructorText() {
088            CommandButtonLabelInfo info = new CommandButtonLabelInfo("Test");
089    
090            assertEquals("Test", info.getText());
091            assertEquals(0, info.getMnemonic());
092            assertEquals(-1, info.getMnemonicIndex());
093            assertNull(info.getAccelerator());
094        }
095    
096        public void testConstructorNullAsLabelInfo() {
097            try {
098                new CommandButtonLabelInfo(null, accelerator);
099                fail("Should throw IllegalArgumentException");
100            }
101            catch (IllegalArgumentException e) {
102                pass();
103            }
104        }
105    
106        public void testConfigureNull() {
107            CommandButtonLabelInfo info = new CommandButtonLabelInfo("test");
108            try {
109                info.configure(null);
110                fail("Should throw IllegalArgumentException");
111            }
112            catch (IllegalArgumentException e) {
113                pass();
114            }
115        }
116    
117        public void testConfigureJButton() {
118            CommandButtonLabelInfo info = new CommandButtonLabelInfo(labelInfo, accelerator);
119    
120            // try a button
121            JButton button = new JButton();
122            info.configure(button);
123    
124            assertEquals(info.getText(), button.getText());
125            assertEquals(info.getMnemonic(), button.getMnemonic());
126            assertEquals(info.getMnemonicIndex(), button.getDisplayedMnemonicIndex());
127        }
128    
129        public void testConfigureJMenuItem() {
130            CommandButtonLabelInfo info = new CommandButtonLabelInfo(labelInfo, accelerator);
131    
132            // try a menu item
133            JMenuItem button = new JMenuItem();
134            info.configure(button);
135    
136            assertEquals(info.getText(), button.getText());
137            assertEquals(info.getMnemonic(), button.getMnemonic());
138            assertEquals(info.getMnemonicIndex(), button.getDisplayedMnemonicIndex());
139            assertEquals(accelerator, button.getAccelerator());
140        }
141        
142    
143        public void testCreateButtonLabelInfoNoAccelerator() {
144            CommandButtonLabelInfo info = CommandButtonLabelInfo.valueOf("S\\&ave with an \\@ &as");
145            System.out.println("XXXXXXXXXXXXXXX " + info.getText());
146            System.out.println("XXXXXXXXXXX 16th char = " + info.getText().charAt(16));
147            assertEquals("S&ave with an @ as", info.getText());
148            assertEquals(KeyEvent.VK_A, info.getMnemonic());
149            assertEquals(16, info.getMnemonicIndex());
150            assertNull(info.getAccelerator());
151        }
152    
153        public void testCreateButtonLabelInfo() {
154            CommandButtonLabelInfo info = CommandButtonLabelInfo.valueOf("S\\@ve &as@ctrl A");
155    
156            assertEquals("S@ve as", info.getText());
157            assertEquals(KeyEvent.VK_A, info.getMnemonic());
158            assertEquals(5, info.getMnemonicIndex());
159            assertNotNull("ctrl A is invalid keystroke", info.getAccelerator());
160            assertEquals(KeyStroke.getKeyStroke("ctrl A"), info.getAccelerator());
161        }
162    
163        public void testCreateButtonLabelInfoInvalidAccelerator() {
164            
165            try {
166                CommandButtonLabelInfo.valueOf("Save &as@Bogus keystroke");
167                Assert.fail("Should have thrown an IllegalArgumentException for invalid KeyStroke format");
168            }
169            catch (IllegalArgumentException e) {
170                //do nothing, test succeeded
171            }
172    
173        }
174        
175        /**
176         * Confirms that exceptions are thrown for label descriptors that violate the syntax rules.
177         */
178        public void testInvalidSyntax() {
179            
180            Iterator entryIterator = this.invalidLabelDescriptors.entrySet().iterator();
181            
182            while (entryIterator.hasNext()) {
183                
184                Map.Entry entry = (Map.Entry) entryIterator.next();
185                
186                try {
187                    CommandButtonLabelInfo.valueOf((String) entry.getKey());
188                    Assert.fail("Should have thrown an IllegalArgumentException for label descriptor [" 
189                                + entry.getKey()
190                                + "] due to "
191                                + entry.getValue());
192                }
193                catch (IllegalArgumentException e) {
194                    //do nothing, test succeeded
195                }
196                
197            }
198            
199        }
200    
201    }