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.settings.support;
017    
018    import javax.swing.JTree;
019    import javax.swing.tree.DefaultMutableTreeNode;
020    import javax.swing.tree.DefaultTreeModel;
021    
022    import junit.framework.TestCase;
023    
024    import org.springframework.richclient.settings.Settings;
025    import org.springframework.richclient.settings.TransientSettings;
026    
027    /**
028     * @author Peter De Bruycker
029     */
030    public class TreeMementoTests extends TestCase {
031    
032        private JTree tree;
033            private TreeMemento memento;
034    
035        public void testConstructor() {
036                    try {
037                            new WindowMemento(null);
038                            fail("Should throw IllegalArgumentException");
039                    } catch (IllegalArgumentException e) {
040                            // test passes
041                    }
042    
043                    try {
044                            tree.setName(null);
045                            new TreeMemento(tree, "");
046                            fail("Should throw IllegalArgumentException: tree has no name");
047                    } catch (Exception e) {
048                            // test passes
049                    }
050    
051                    tree.setName("tree0");
052    
053                    TreeMemento memento = new TreeMemento(tree);
054                    assertEquals(tree, memento.getTree());
055                    assertEquals("tree0", memento.getKey());
056                    
057                    memento = new TreeMemento(tree, "key");
058                    assertEquals(tree, memento.getTree());
059                    assertEquals("key", memento.getKey());
060            }
061        
062        public void testSaveSelectionState() {
063            TransientSettings settings = new TransientSettings();
064    
065            memento.saveSelectionState(settings);
066            assertFalse(settings.contains("tree.selectedRows"));
067    
068            tree.setSelectionRows(new int[] { 0, 2, 3 });
069            memento.saveSelectionState(settings);
070            assertTrue(settings.contains("tree.selectedRows"));
071            assertEquals("0,2-3", settings.getString("tree.selectedRows"));
072        }
073    
074        public void testRestoreSelectionState() {
075            Settings settings = new TransientSettings();
076    
077            settings.setString("tree.selectedRows", "0,2-3");
078            memento.restoreSelectionState(settings);
079    
080            assertEquals(5, tree.getRowCount());
081            assertTrue(tree.isRowSelected(0));
082            assertFalse(tree.isRowSelected(1));
083            assertTrue(tree.isRowSelected(2));
084            assertTrue(tree.isRowSelected(3));
085            assertFalse(tree.isRowSelected(4));
086        }
087    
088        public void testSaveExpansionState() {
089            Settings settings = new TransientSettings();
090    
091            memento.saveExpansionState(settings);
092            assertTrue(settings.contains("tree.expansionState"));
093            assertEquals("1,0,0,0,0", settings.getString("tree.expansionState"));
094    
095            // expand child2
096            tree.expandRow(2);
097    
098            memento.saveExpansionState(settings);
099            assertTrue(settings.contains("tree.expansionState"));
100            assertEquals("1,0,1,0,0,0,0", settings.getString("tree.expansionState"));
101        }
102    
103        public void testRestoreExpansionState() {
104            Settings settings = new TransientSettings();
105            settings.setString("tree.expansionState", "1,0,1,0,0,0,0");
106    
107            memento.restoreExpansionState(settings);
108    
109            assertEquals(7, tree.getRowCount());
110            assertTrue(tree.isExpanded(0));
111            assertFalse(tree.isExpanded(1));
112            assertTrue(tree.isExpanded(2));
113            assertFalse(tree.isExpanded(3));
114            assertFalse(tree.isExpanded(4));
115            assertFalse(tree.isExpanded(5));
116            assertFalse(tree.isExpanded(6));
117        }
118    
119        public void testRestoreExpansionStateWithInvalidSettingsString() {
120            Settings settings = new TransientSettings();
121            settings.setString("key.expansionState", "invalidPref");
122    
123            memento.restoreExpansionState(settings);
124    
125            assertEquals(5, tree.getRowCount());
126            assertTrue(tree.isExpanded(0));
127            assertFalse(tree.isExpanded(1));
128            assertFalse(tree.isExpanded(2));
129            assertFalse(tree.isExpanded(3));
130            assertFalse(tree.isExpanded(4));
131        }
132    
133        protected void setUp() throws Exception {
134            DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
135    
136            DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("child1");
137            child1.add(new DefaultMutableTreeNode("child1.1"));
138            root.add(child1);
139    
140            DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("child2");
141            child2.add(new DefaultMutableTreeNode("child2.1"));
142            child2.add(new DefaultMutableTreeNode("child2.2"));
143            root.add(child2);
144            root.add(new DefaultMutableTreeNode("child3"));
145            root.add(new DefaultMutableTreeNode("child4"));
146    
147            DefaultTreeModel treeModel = new DefaultTreeModel(root);
148            tree = new JTree(treeModel);
149            
150            memento = new TreeMemento(tree, "tree");
151        }
152    }