View Javadoc

1   // Copyright (C) 2004 - 2009 Philip Aston
2   // All rights reserved.
3   //
4   // This file is part of The Grinder software distribution. Refer to
5   // the file LICENSE which is part of The Grinder distribution for
6   // licensing details. The Grinder distribution is available on the
7   // Internet at http://grinder.sourceforge.net/
8   //
9   // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
10  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
11  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
12  // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
13  // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
14  // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
15  // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
16  // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
17  // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
18  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
19  // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
20  // OF THE POSSIBILITY OF SUCH DAMAGE.
21  
22  package net.grinder.console.swingui;
23  
24  import junit.framework.TestCase;
25  
26  import javax.swing.event.TreeModelEvent;
27  import javax.swing.event.TreeModelListener;
28  import javax.swing.tree.DefaultMutableTreeNode;
29  import javax.swing.tree.DefaultTreeModel;
30  import javax.swing.tree.TreeModel;
31  
32  import net.grinder.testutility.AssertUtilities;
33  import net.grinder.testutility.CallData;
34  import net.grinder.testutility.DelegatingStubFactory;
35  import net.grinder.testutility.RandomStubFactory;
36  
37  
38  /**
39   * Unit tests for {@link CompositeTreeModel}.
40   *
41   * @author Philip Aston
42   */
43  public class TestCompositeTreeModel extends TestCase {
44  
45    public void testConstruction() throws Exception {
46      final CompositeTreeModel compositeTreeModel = new CompositeTreeModel();
47      assertNotNull(compositeTreeModel.getRoot());
48      assertEquals(compositeTreeModel.getRoot(), compositeTreeModel.getRoot());
49  
50      final CompositeTreeModel compositeTreeModel2 = new CompositeTreeModel();
51      AssertUtilities.assertNotEquals(compositeTreeModel.getRoot(),
52                                      compositeTreeModel2.getRoot());
53    }
54  
55    public void testGetChildMethods() throws Exception {
56      final CompositeTreeModel compositeTreeModel = new CompositeTreeModel();
57  
58      final Object root = compositeTreeModel.getRoot();
59  
60      assertNull(compositeTreeModel.getChild(root, -10));
61      assertNull(compositeTreeModel.getChild(root, 0));
62      assertNull(compositeTreeModel.getChild(new Object(), 0));
63      assertEquals(0, compositeTreeModel.getChildCount(root));
64      assertEquals(0, compositeTreeModel.getChildCount(new Object()));
65      assertEquals(-1, compositeTreeModel.getIndexOfChild(root, null));
66      assertEquals(-1, compositeTreeModel.getIndexOfChild(null, root));
67      assertEquals(-1, compositeTreeModel.getIndexOfChild(root, new Object()));
68      assertEquals(-1, compositeTreeModel.getIndexOfChild(new Object(), root));
69      assertFalse(compositeTreeModel.isLeaf(root));
70      assertFalse(compositeTreeModel.isLeaf(new Object()));
71  
72      final TreeModel delegateModel1 = createTreeModel();
73      final DelegatingStubFactory<DefaultTreeModel> delegateModelStubFactory1 =
74        DelegatingStubFactory.create(createTreeModel());
75      final TreeModel instrumentedDelegateModel1 =
76        delegateModelStubFactory1.getStub();
77  
78      compositeTreeModel.addTreeModel(instrumentedDelegateModel1, true);
79  
80      assertSame(root, compositeTreeModel.getRoot());
81      assertNull(compositeTreeModel.getChild(root, -10));
82  
83      final Object rootOfFirstTree = compositeTreeModel.getChild(root, 0);
84      assertFalse(compositeTreeModel.isLeaf(rootOfFirstTree));
85      // Identity not equal because of wrapping: compare node text
86      // instead.
87      assertEquals("Root", rootOfFirstTree.toString());
88      assertNull(compositeTreeModel.getChild(root, 1));
89      delegateModelStubFactory1.assertSuccess("getRoot");
90      delegateModelStubFactory1.assertSuccess("isLeaf", rootOfFirstTree);
91  
92      final Object delegateRoot1 = delegateModel1.getRoot();
93  
94      assertNull(compositeTreeModel.getChild(root, 1));
95      assertEquals("Child2",
96                   compositeTreeModel.getChild(delegateRoot1, 1).toString());
97      delegateModelStubFactory1.assertSuccess("getChild", delegateRoot1,
98                                              new Integer(1));
99  
100     assertEquals(1, compositeTreeModel.getChildCount(root));
101     assertEquals(2, compositeTreeModel.getChildCount(delegateRoot1));
102     delegateModelStubFactory1.assertSuccess("getChildCount", delegateRoot1);
103     delegateModelStubFactory1.assertNoMoreCalls();
104 
105     assertEquals(-1, compositeTreeModel.getIndexOfChild(root, delegateRoot1));
106 
107     final Object child1 = delegateModel1.getChild(delegateRoot1, 0);
108     assertEquals(0, compositeTreeModel.getIndexOfChild(delegateRoot1, child1));
109 
110     final Object grandChild = delegateModel1.getChild(child1, 0);
111     assertEquals(0, compositeTreeModel.getIndexOfChild(child1, grandChild));
112     assertTrue(compositeTreeModel.isLeaf(grandChild));
113 
114     delegateModelStubFactory1.resetCallHistory();
115 
116     final TreeModel delegateModel2 = createTreeModel();
117     final Object delegateRoot2 = delegateModel2.getRoot();
118 
119     compositeTreeModel.addTreeModel(delegateModel2, false);
120     assertEquals(3, compositeTreeModel.getChildCount(root));
121 
122     assertEquals("Child1",
123                  compositeTreeModel.getChild(delegateRoot1, 0).toString());
124     delegateModelStubFactory1.assertSuccess("getChild", delegateRoot1,
125                                             new Integer(0));
126     assertEquals("Child1", compositeTreeModel.getChild(root, 1).toString());
127     assertEquals("Child2", compositeTreeModel.getChild(root, 2).toString());
128 
129     final Object otherChild2 = delegateModel2.getChild(delegateRoot2, 1);
130 
131     assertEquals(1, delegateModel2.getIndexOfChild(delegateRoot2,
132                                                    otherChild2));
133     assertEquals(2, compositeTreeModel.getIndexOfChild(root, otherChild2));
134   }
135 
136   public void testListeners() throws Exception {
137     final CompositeTreeModel compositeTreeModel = new CompositeTreeModel();
138     final Object root = compositeTreeModel.getRoot();
139 
140     final RandomStubFactory<TreeModelListener> listener1StubFactory =
141       RandomStubFactory.create(TreeModelListener.class);
142     listener1StubFactory.setIgnoreObjectMethods();
143 
144     compositeTreeModel.addTreeModelListener(listener1StubFactory.getStub());
145 
146     compositeTreeModel.valueForPathChanged(null, null);
147     listener1StubFactory.assertNoMoreCalls();
148 
149     final DefaultTreeModel delegateModel = createTreeModel();
150     final DefaultMutableTreeNode delegateRoot =
151       (DefaultMutableTreeNode)delegateModel.getRoot();
152 
153     compositeTreeModel.addTreeModel(delegateModel, false);
154 
155     final RandomStubFactory<TreeModelListener> listener2StubFactory =
156       RandomStubFactory.create(TreeModelListener.class);
157     listener2StubFactory.setIgnoreObjectMethods();
158 
159     compositeTreeModel.addTreeModelListener(listener2StubFactory.getStub());
160 
161     final DefaultMutableTreeNode child3 = new DefaultMutableTreeNode("Child3");
162     delegateModel.insertNodeInto(child3, delegateRoot, 2);
163 
164     final CallData insertCallData =
165       listener1StubFactory.assertSuccess("treeNodesInserted",
166                                          TreeModelEvent.class);
167 
168     final TreeModelEvent insertEvent =
169       (TreeModelEvent)insertCallData.getParameters()[0];
170 
171     AssertUtilities.assertArraysEqual(
172       new Object[] { root, }, insertEvent.getPath());
173 
174     listener1StubFactory.assertNoMoreCalls();
175     listener2StubFactory.assertSuccess("treeNodesInserted",
176                                        TreeModelEvent.class);
177     listener2StubFactory.assertNoMoreCalls();
178 
179     compositeTreeModel.removeTreeModelListener(listener1StubFactory.getStub());
180 
181     final DefaultMutableTreeNode grandChild2 =
182       new DefaultMutableTreeNode("Grandchild2");
183     delegateModel.insertNodeInto(grandChild2, child3, 0);
184 
185     listener1StubFactory.assertNoMoreCalls();
186 
187     final CallData insertCallData2 =
188       listener2StubFactory.assertSuccess("treeNodesInserted",
189                                          TreeModelEvent.class);
190 
191     final TreeModelEvent insertEvent2 =
192       (TreeModelEvent)insertCallData2.getParameters()[0];
193 
194     AssertUtilities.assertArraysEqual(
195       new Object[] { root, child3 }, insertEvent2.getPath());
196 
197     // Removing twice should be a no-op.
198     compositeTreeModel.removeTreeModelListener(listener1StubFactory.getStub());
199   }
200 
201   private DefaultTreeModel createTreeModel() {
202     final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
203     final DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child1");
204     final DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child2");
205     final DefaultMutableTreeNode grandChild =
206       new DefaultMutableTreeNode("Grandchild");
207     child1.add(grandChild);
208     root.add(child1);
209     root.add(child2);
210     return new DefaultTreeModel(root);
211   }
212 }