001 /*
002 * Created on Dec 26, 2009
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2009-2010 the original author or authors.
015 */
016 package org.fest.swing.fixture;
017
018 import javax.swing.JTree;
019
020 import org.fest.swing.core.MouseButton;
021 import org.fest.swing.core.MouseClickInfo;
022 import org.fest.swing.exception.*;
023
024 /**
025 * Understands functional testing of single nodes, referenced by their paths, in <code>{@link JTree}</code>s:
026 * <ul>
027 * <li>user input simulation</li>
028 * <li>state verification</li>
029 * <li>property value query</li>
030 * </ul>
031 *
032 * @author Alex Ruiz
033 *
034 * @since 1.2
035 */
036 public class JTreePathFixture implements JTreeNodeFixture {
037
038 private final String path;
039 private final JTreeFixture tree;
040
041 /**
042 * Creates a new </code>{@link JTreePathFixture}</code>.
043 * @param tree handles the <code>JTree</code> containing the node with the given path.
044 * @param path the given path.
045 */
046 protected JTreePathFixture(JTreeFixture tree, String path) {
047 this.tree = tree;
048 this.path = path;
049 }
050
051 /**
052 * Simulates a user expanding this fixture's tree node.
053 * @return this fixture.
054 * @throws IllegalStateException if the <code>JTree</code> is disabled.
055 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
056 * @throws ActionFailedException if this method fails to expand the path.
057 * @since 1.2
058 */
059 public JTreePathFixture expand() {
060 tree.expandPath(path);
061 return this;
062 }
063
064 /**
065 * Simulates a user collapsing this fixture's tree node.
066 * @return this fixture.
067 * @throws IllegalStateException if the <code>JTree</code> is disabled.
068 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
069 * @throws ActionFailedException if this method fails to collapse the path.
070 * @since 1.2
071 */
072 public JTreePathFixture collapse() {
073 tree.collapsePath(path);
074 return this;
075 }
076
077 /**
078 * Selects the this fixture's tree node, expanding parent nodes if necessary. This method will not click the node if
079 * it is already selected.
080 * @return this fixture.
081 * @throws IllegalStateException if this fixture's <code>JTree</code> is disabled.
082 * @throws IllegalStateException if this fixture's <code>JTree</code> is not showing on the screen.
083 */
084 public JTreePathFixture select() {
085 tree.selectPath(path);
086 return this;
087 }
088
089 /**
090 * Simulates a user clicking this fixture's tree node.
091 * @return this fixture.
092 * @throws IllegalStateException if the <code>JTree</code> is disabled.
093 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
094 */
095 public JTreePathFixture click() {
096 tree.clickPath(path);
097 return this;
098 }
099
100 /**
101 * Simulates a user clicking this fixture's tree node.
102 * @param button the button to click.
103 * @return this fixture.
104 * @throws NullPointerException if the given button is <code>null</code>.
105 * @throws IllegalStateException if the <code>JTree</code> is disabled.
106 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
107 */
108 public JTreePathFixture click(MouseButton button) {
109 tree.clickPath(path, button);
110 return this;
111 }
112
113 /**
114 * Simulates a user clicking this fixture's tree node.
115 * @param mouseClickInfo specifies the button to click and the times the button should be clicked.
116 * @return this fixture.
117 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>.
118 * @throws IllegalStateException if the <code>JTree</code> is disabled.
119 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
120 */
121 public JTreePathFixture click(MouseClickInfo mouseClickInfo) {
122 tree.clickPath(path, mouseClickInfo);
123 return this;
124 }
125
126 /**
127 * Simulates a user double-clicking this fixture's tree node.
128 * @return this fixture.
129 * @throws IllegalStateException if the <code>JTree</code> is disabled.
130 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
131 */
132 public JTreePathFixture doubleClick() {
133 tree.doubleClickPath(path);
134 return this;
135 }
136
137 /**
138 * Simulates a user right-clicking this fixture's tree node.
139 * @return this fixture.
140 * @throws IllegalStateException if the <code>JTree</code> is disabled.
141 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
142 */
143 public JTreePathFixture rightClick() {
144 tree.rightClickPath(path);
145 return this;
146 }
147
148 /**
149 * Simulates a user dragging this fixture's tree node.
150 * @return this fixture.
151 * @throws IllegalStateException if the <code>JTree</code> is disabled.
152 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
153 */
154 public JTreePathFixture drag() {
155 tree.drag(path);
156 return this;
157 }
158
159 /**
160 * Simulates a user dropping relative to this fixture's tree node.
161 * @return this fixture.
162 * @throws IllegalStateException if the <code>JTree</code> is disabled.
163 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
164 * @throws ActionFailedException if there is no drag action in effect.
165 */
166 public JTreePathFixture drop() {
167 tree.drop(path);
168 return this;
169 }
170
171 /**
172 * Shows a pop-up menu using this fixture's tree node as the invoker of the pop-up menu.
173 * @return a fixture that handles functional testing of the displayed pop-up menu.
174 * @throws IllegalStateException if the <code>JTree</code> is disabled.
175 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
176 * @throws ComponentLookupException if a pop-up menu cannot be found.
177 */
178 public JPopupMenuFixture showPopupMenu() {
179 return tree.showPopupMenuAt(path);
180 }
181
182 /**
183 * Returns the <code>String</code> representation of this fixture's tree node.
184 * @return the <code>String</code> representation of this fixture's tree node.
185 */
186 public String value() {
187 return tree.valueAt(path);
188 }
189
190 /**
191 * Returns the path of this fixture's node.
192 * @return the path of this fixture's node.
193 */
194 public String path() {
195 return path;
196 }
197 }