001 /* 002 * Created on Mar 16, 2008 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 @2008-2010 the original author or authors. 015 */ 016 package org.fest.swing.fixture; 017 018 import java.util.regex.Pattern; 019 020 import javax.swing.JPopupMenu; 021 import javax.swing.table.JTableHeader; 022 023 import org.fest.swing.core.MouseClickInfo; 024 import org.fest.swing.core.Robot; 025 import org.fest.swing.driver.JTableHeaderDriver; 026 import org.fest.swing.exception.ComponentLookupException; 027 import org.fest.swing.exception.LocationUnavailableException; 028 029 /** 030 * Understands functional testing of <code>{@link JTableHeader}</code>s: 031 * <ul> 032 * <li>user input simulation</li> 033 * <li>state verification</li> 034 * <li>property value query</li> 035 * </ul> 036 * 037 * @author Yvonne Wang 038 * @author Alex Ruiz 039 */ 040 public class JTableHeaderFixture extends ComponentFixture<JTableHeader> implements JComponentFixture { 041 042 private JTableHeaderDriver driver; 043 044 /** 045 * Creates a new </code>{@link JTableHeaderFixture}</code>. 046 * @param robot performs simulation of user events on the given <code>JTableHeader</code>. 047 * @param target the <code>JTableHeader</code> to be managed by this fixture. 048 * @throws NullPointerException if <code>robot</code> is <code>null</code>. 049 * @throws NullPointerException if <code>target</code> is <code>null</code>. 050 */ 051 public JTableHeaderFixture(Robot robot, JTableHeader target) { 052 super(robot, target); 053 driver(new JTableHeaderDriver(robot)); 054 } 055 056 /** 057 * Sets the <code>{@link JTableHeaderDriver}</code> to be used by this fixture. 058 * @param newDriver the new <code>JTableHeaderDriver</code>. 059 * @throws NullPointerException if the given driver is <code>null</code>. 060 */ 061 protected final void driver(JTableHeaderDriver newDriver) { 062 validateNotNull(newDriver); 063 driver = newDriver; 064 } 065 066 /** 067 * Simulates a user clicking the column under the given index, in this fixture's <code>{@link JTableHeader}</code>. 068 * @param index the index of the column to click. 069 * @return this fixture. 070 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 071 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 072 * @throws IndexOutOfBoundsException if the index is out of bounds. 073 */ 074 public JTableHeaderFixture clickColumn(int index) { 075 driver.clickColumn(target, index); 076 return this; 077 } 078 079 /** 080 * Shows a pop-up menu using this fixture's <code>{@link JTableHeader}</code> as the invoker of the pop-up menu. 081 * @param columnIndex the index of the column where the pop-up menu will be displayed. 082 * @return a fixture that manages the displayed pop-up menu. 083 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 084 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 085 * @throws IndexOutOfBoundsException if the index is out of bounds. 086 * @throws ComponentLookupException if a pop-up menu cannot be found. 087 */ 088 public JPopupMenuFixture showPopupMenuAt(int columnIndex) { 089 JPopupMenu popupMenu = driver.showPopupMenu(target, columnIndex); 090 return new JPopupMenuFixture(robot, popupMenu); 091 } 092 093 /** 094 * Shows a pop-up menu using this fixture's <code>{@link JTableHeader}</code> as the invoker of the pop-up menu. 095 * @param columnName the name of the column where the pop-up menu will be displayed. It can be a regular expression. 096 * @return a fixture that manages the displayed pop-up menu. 097 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 098 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 099 * @throws ComponentLookupException if a pop-up menu cannot be found. 100 */ 101 public JPopupMenuFixture showPopupMenuAt(String columnName) { 102 JPopupMenu popupMenu = driver.showPopupMenu(target, columnName); 103 return new JPopupMenuFixture(robot, popupMenu); 104 } 105 106 /** 107 * Shows a pop-up menu using this fixture's <code>{@link JTableHeader}</code> as the invoker of the pop-up menu. The 108 * name of the column to use must match the given regular expression pattern. 109 * @param columnNamePattern the regular expression pattern to match. 110 * @return a fixture that manages the displayed pop-up menu. 111 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 112 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 113 * @throws NullPointerException if the given regular expression pattern is <code>null</code>. 114 * @throws ComponentLookupException if a pop-up menu cannot be found. 115 * @since 1.2 116 */ 117 public JPopupMenuFixture showPopupMenuAt(Pattern columnNamePattern) { 118 JPopupMenu popupMenu = driver.showPopupMenu(target, columnNamePattern); 119 return new JPopupMenuFixture(robot, popupMenu); 120 } 121 122 /** 123 * Simulates a user clicking the column under the given index, in this fixture's <code>{@link JTableHeader}</code>, 124 * using the given mouse button, the given number of times. 125 * @param index the index of the column to click. 126 * @param mouseClickInfo specifies the mouse button to use and the number of times to click. 127 * @return this fixture. 128 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>. 129 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 130 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 131 * @throws IndexOutOfBoundsException if the index is out of bounds. 132 */ 133 public JTableHeaderFixture clickColumn(int index, MouseClickInfo mouseClickInfo) { 134 validateNotNull(mouseClickInfo); 135 driver.clickColumn(target, index, mouseClickInfo.button(), mouseClickInfo.times()); 136 return this; 137 } 138 139 /** 140 * Simulates a user clicking the column which name matches the given value, in this fixture's 141 * <code>{@link JTableHeader}</code>. 142 * @param columnName the column name to match. It can be a regular expression. 143 * @return this fixture. 144 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 145 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 146 * @throws LocationUnavailableException if a column with a matching name cannot be found. 147 */ 148 public JTableHeaderFixture clickColumn(String columnName) { 149 driver.clickColumn(target, columnName); 150 return this; 151 } 152 153 /** 154 * Simulates a user clicking the column which name matches the given regular expression pattern, in this fixture's 155 * <code>{@link JTableHeader}</code>. 156 * @param columnNamePattern the regular expression pattern to match. 157 * @return this fixture. 158 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 159 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 160 * @throws NullPointerException if the given regular expression is <code>null</code>. 161 * @throws LocationUnavailableException if a column with a matching name cannot be found. 162 * @since 1.2 163 */ 164 public JTableHeaderFixture clickColumn(Pattern columnNamePattern) { 165 driver.clickColumn(target, columnNamePattern); 166 return this; 167 } 168 169 /** 170 * Simulates a user clicking the column which name matches the given one, in this fixture's 171 * <code>{@link JTableHeader}</code>, using the given mouse button, the given number of times. 172 * @param columnName the column name to match. It can be a regular expression. 173 * @param mouseClickInfo specifies the mouse button to use and the number of times to click. 174 * @return this fixture. 175 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>. 176 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 177 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 178 * @throws LocationUnavailableException if a column with a matching name cannot be found. 179 */ 180 public JTableHeaderFixture clickColumn(String columnName, MouseClickInfo mouseClickInfo) { 181 validateNotNull(mouseClickInfo); 182 driver.clickColumn(target, columnName, mouseClickInfo.button(), mouseClickInfo.times()); 183 return this; 184 } 185 186 /** 187 * Simulates a user clicking the column which name matches the given regular expression pattern, in this fixture's 188 * <code>{@link JTableHeader}</code>, using the given mouse button, the given number of times. 189 * @param columnNamePattern the regular expression pattern to match. 190 * @param mouseClickInfo specifies the mouse button to use and the number of times to click. 191 * @return this fixture. 192 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>. 193 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is disabled. 194 * @throws IllegalStateException if this fixture's <code>JTableHeader</code> is not showing on the screen. 195 * @throws NullPointerException if the given regular expression pattern is <code>null</code>. 196 * @throws LocationUnavailableException if a column with a matching name cannot be found. 197 * @since 1.2 198 */ 199 public JTableHeaderFixture clickColumn(Pattern columnNamePattern, MouseClickInfo mouseClickInfo) { 200 validateNotNull(mouseClickInfo); 201 driver.clickColumn(target, columnNamePattern, mouseClickInfo.button(), mouseClickInfo.times()); 202 return this; 203 } 204 205 private void validateNotNull(MouseClickInfo mouseClickInfo) { 206 if (mouseClickInfo == null) throw new NullPointerException("The given MouseClickInfo should not be null"); 207 } 208 209 210 /** 211 * Asserts that the toolTip in this fixture's <code>{@link JTableHeader}</code> matches the given value. 212 * @param expected the given value. It can be a regular expression. 213 * @return this fixture. 214 * @throws AssertionError if the toolTip in this fixture's <code>JTableHeader</code> does not match the given value. 215 * @since 1.2 216 */ 217 public JTableHeaderFixture requireToolTip(String expected) { 218 driver.requireToolTip(target, expected); 219 return this; 220 } 221 222 /** 223 * Asserts that the toolTip in this fixture's <code>{@link JTableHeader}</code> matches the given regular expression 224 * pattern. 225 * @param pattern the regular expression pattern to match. 226 * @return this fixture. 227 * @throws NullPointerException if the given regular expression pattern is <code>null</code>. 228 * @throws AssertionError if the toolTip in this fixture's <code>JTableHeader</code> does not match the given regular 229 * expression. 230 * @since 1.2 231 */ 232 public JTableHeaderFixture requireToolTip(Pattern pattern) { 233 driver.requireToolTip(target, pattern); 234 return this; 235 } 236 237 /** 238 * Returns the client property stored in this fixture's <code>{@link JTableHeader}</code>, under the given key. 239 * @param key the key to use to retrieve the client property. 240 * @return the value of the client property stored under the given key, or <code>null</code> if the property was 241 * not found. 242 * @throws NullPointerException if the given key is <code>null</code>. 243 * @since 1.2 244 */ 245 public Object clientProperty(Object key) { 246 return driver.clientProperty(target, key); 247 } 248 }