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.TreePath;
29  
30  import net.grinder.console.common.Resources;
31  import net.grinder.console.common.ResourcesImplementation;
32  import net.grinder.console.distribution.AgentCacheState;
33  import net.grinder.console.distribution.FileChangeWatcher;
34  import net.grinder.console.editor.Buffer;
35  import net.grinder.console.editor.EditorModel;
36  
37  import net.grinder.console.editor.StringTextSource;
38  import net.grinder.testutility.CallData;
39  import net.grinder.testutility.RandomStubFactory;
40  
41  
42  /**
43   * Unit tests for {@link BufferTreeModel}.
44   *
45   * @author Philip Aston
46   */
47  public class TestBufferTreeModel extends TestCase {
48  
49    private static final Resources s_resources =
50        new ResourcesImplementation(
51          "net.grinder.console.common.resources.Console");
52  
53    private final RandomStubFactory<AgentCacheState>
54      m_agentCacheStateStubFactory =
55        RandomStubFactory.create(AgentCacheState.class);
56    private final AgentCacheState m_agentCacheState =
57      m_agentCacheStateStubFactory.getStub();
58  
59    private final RandomStubFactory<FileChangeWatcher>
60      m_fileChangeWatcherStubFactory =
61        RandomStubFactory.create(FileChangeWatcher.class);
62    private final FileChangeWatcher m_fileChangeWatcher =
63      m_fileChangeWatcherStubFactory.getStub();
64  
65    public void testConstructionAndGetChildMethods() throws Exception {
66      final StringTextSource.Factory stringTextSourceFactory =
67        new StringTextSource.Factory();
68  
69      final EditorModel editorModel = new EditorModel(s_resources,
70                                                      stringTextSourceFactory,
71                                                      m_agentCacheState,
72                                                      m_fileChangeWatcher);
73  
74      editorModel.selectNewBuffer();
75  
76      final BufferTreeModel bufferTreeModel = new BufferTreeModel(editorModel);
77  
78      final Object rootNode = bufferTreeModel.getRoot();
79      assertNotNull(rootNode);
80      assertEquals(1, bufferTreeModel.getChildCount(rootNode));
81      assertNull(bufferTreeModel.getChild(rootNode, 1));
82  
83      final BufferTreeModel.BufferNode bufferNode =
84        (BufferTreeModel.BufferNode)bufferTreeModel.getChild(rootNode, 0);
85      assertSame(bufferNode.getBuffer(), editorModel.getSelectedBuffer());
86      assertTrue(bufferNode.belongsToModel(bufferTreeModel));
87      assertEquals(bufferNode.getBuffer().getDisplayName(),
88                   bufferNode.toString());
89      final Object[] path = bufferNode.getPath().getPath();
90      assertEquals(2, path.length);
91      assertSame(rootNode, path[0]);
92      assertSame(bufferNode, path[1]);
93      assertTrue(bufferNode.canOpen());
94  
95      final BufferTreeModel.BufferNode anotherBufferNode =
96        new BufferTreeModel(editorModel).new BufferNode(null);
97      assertFalse(anotherBufferNode.belongsToModel(bufferTreeModel));
98  
99      assertEquals(0, bufferTreeModel.getChildCount(bufferNode));
100     assertNull(bufferTreeModel.getChild(bufferNode, 0));
101 
102     assertEquals(-1, bufferTreeModel.getIndexOfChild(null, bufferNode));
103     assertEquals(-1, bufferTreeModel.getIndexOfChild(rootNode, null));
104     assertEquals(-1, bufferTreeModel.getIndexOfChild(bufferNode, rootNode));
105     assertEquals(-1,
106                  bufferTreeModel.getIndexOfChild(rootNode, anotherBufferNode));
107 
108     assertEquals(0, bufferTreeModel.getIndexOfChild(rootNode, bufferNode));
109 
110     assertTrue(bufferTreeModel.isLeaf(bufferNode));
111     assertFalse(bufferTreeModel.isLeaf(rootNode));
112     assertFalse(bufferTreeModel.isLeaf(anotherBufferNode));
113   }
114 
115   public void testSettersAndListeners() throws Exception {
116     final StringTextSource.Factory stringTextSourceFactory =
117       new StringTextSource.Factory();
118 
119     final EditorModel editorModel = new EditorModel(s_resources,
120                                                     stringTextSourceFactory,
121                                                     m_agentCacheState,
122                                                     m_fileChangeWatcher);
123     editorModel.selectNewBuffer();
124     final Buffer buffer2 = editorModel.getSelectedBuffer();
125 
126     final BufferTreeModel bufferTreeModel = new BufferTreeModel(editorModel);
127 
128     final RandomStubFactory<TreeModelListener> listener1StubFactory =
129       RandomStubFactory.create(TreeModelListener.class);
130     final RandomStubFactory<TreeModelListener> listener2StubFactory =
131       RandomStubFactory.create(TreeModelListener.class);
132 
133     bufferTreeModel.addTreeModelListener(listener1StubFactory.getStub());
134     bufferTreeModel.addTreeModelListener(listener2StubFactory.getStub());
135 
136     final TreePath treePath = new TreePath(new Object());
137     bufferTreeModel.valueForPathChanged(treePath, null);
138 
139     final CallData treeNodesChangedCallData =
140       listener1StubFactory.assertSuccess("treeNodesChanged",
141                                          TreeModelEvent.class);
142     final TreeModelEvent event =
143       (TreeModelEvent)treeNodesChangedCallData.getParameters()[0];
144     assertSame(treePath, event.getTreePath());
145     assertSame(bufferTreeModel, event.getSource());
146     listener1StubFactory.assertNoMoreCalls();
147 
148     listener2StubFactory.assertSuccess("treeNodesChanged",
149                                        TreeModelEvent.class);
150     listener2StubFactory.assertNoMoreCalls();
151 
152     bufferTreeModel.removeTreeModelListener(listener1StubFactory.getStub());
153 
154     // removeTreeModelListener() can calls equals() on the listeners.
155     listener1StubFactory.resetCallHistory();
156     listener2StubFactory.resetCallHistory();
157 
158     editorModel.selectBuffer(buffer2);
159 
160     listener1StubFactory.assertNoMoreCalls();
161     listener2StubFactory.assertNoMoreCalls();
162 
163     final EditorModel editorModel2 = new EditorModel(s_resources,
164                                                     stringTextSourceFactory,
165                                                     m_agentCacheState,
166                                                     m_fileChangeWatcher);
167 
168     editorModel2.selectNewBuffer();
169     final Buffer anotherBuffer = editorModel2.getSelectedBuffer();
170     bufferTreeModel.bufferChanged(anotherBuffer);
171 
172     listener1StubFactory.assertNoMoreCalls();
173     listener2StubFactory.assertNoMoreCalls();
174 
175     final Buffer buffer = editorModel.getSelectedBuffer();
176     bufferTreeModel.bufferChanged(buffer);
177 
178     listener1StubFactory.assertNoMoreCalls();
179     listener2StubFactory.assertSuccess("treeNodesChanged",
180                                        TreeModelEvent.class);
181 
182     editorModel.selectNewBuffer();
183 
184     final CallData treeStructureChangedCallData =
185       listener2StubFactory.assertSuccess("treeStructureChanged",
186                                          TreeModelEvent.class);
187     final TreeModelEvent treeStructureChangedEvent =
188       (TreeModelEvent)treeStructureChangedCallData.getParameters()[0];
189     assertSame(bufferTreeModel, treeStructureChangedEvent.getSource());
190     assertEquals(1, treeStructureChangedEvent.getPath().length);
191     assertSame(bufferTreeModel.getRoot(),
192                treeStructureChangedEvent.getPath()[0]);
193 
194     listener1StubFactory.assertNoMoreCalls();
195     listener2StubFactory.assertNoMoreCalls();
196 
197     editorModel.closeBuffer(buffer);
198 
199     final CallData treeStructureChangedCallData2 =
200       listener2StubFactory.assertSuccess("treeStructureChanged",
201                                          TreeModelEvent.class);
202     final TreeModelEvent treeStructureChangedEvent2 =
203       (TreeModelEvent)treeStructureChangedCallData2.getParameters()[0];
204     assertSame(bufferTreeModel, treeStructureChangedEvent2.getSource());
205     assertEquals(1, treeStructureChangedEvent2.getPath().length);
206     assertSame(bufferTreeModel.getRoot(),
207                treeStructureChangedEvent2.getPath()[0]);
208 
209     listener1StubFactory.assertNoMoreCalls();
210     listener2StubFactory.assertNoMoreCalls();
211   }
212 }