001 /* 002 * Created on Dec 8, 2007 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 @2007-2010 the original author or authors. 015 */ 016 package org.fest.swing.fixture; 017 018 import static org.fest.swing.core.MouseButton.LEFT_BUTTON; 019 import static org.fest.swing.core.MouseButton.RIGHT_BUTTON; 020 021 import javax.swing.JList; 022 023 import org.fest.swing.cell.JListCellReader; 024 import org.fest.swing.core.MouseButton; 025 import org.fest.swing.core.MouseClickInfo; 026 import org.fest.swing.exception.ActionFailedException; 027 import org.fest.swing.exception.ComponentLookupException; 028 029 /** 030 * Understands functional testing of single rows in <code>{@link JList}</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 JListItemFixture implements ItemFixture { 041 042 final JListFixture list; 043 final int index; 044 045 /** 046 * Creates a new </code>{@link JListItemFixture}</code>. 047 * @param list manages the <code>JList</code> containing the list item to be managed by this fixture. 048 * @param index index of the list item to be managed by this fixture. 049 * @throws NullPointerException if <code>list</code> is <code>null</code>. 050 */ 051 public JListItemFixture(JListFixture list, int index) { 052 if (list == null) throw new NullPointerException("The given JListFixture should not be null"); 053 this.list = list; 054 this.index = index; 055 } 056 057 /** 058 * Simulates a user selecting this fixture's list item. 059 * @return this fixture. 060 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 061 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 062 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 063 * the <code>JList</code>. 064 */ 065 public final JListItemFixture select() { 066 list.selectItem(index); 067 return this; 068 } 069 070 /** 071 * Simulates a user clicking this fixture's list item. 072 * @return this fixture. 073 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 074 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 075 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 076 * the <code>JList</code>. 077 */ 078 public final JListItemFixture click() { 079 list.clickItem(index); 080 return this; 081 } 082 083 /** 084 * Simulates a user clicking this fixture's list item. 085 * @param button the button to click. 086 * @return this fixture. 087 * @throws NullPointerException if the given <code>MouseButton</code> is <code>null</code>. 088 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 089 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 090 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 091 * the <code>JList</code>. 092 */ 093 public final JListItemFixture click(MouseButton button) { 094 list.clickItem(index, button, 1); 095 return this; 096 } 097 098 /** 099 * Simulates a user clicking this fixture's list item. 100 * @param mouseClickInfo specifies the button to click and the times the button should be clicked. 101 * @return this fixture. 102 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>. 103 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 104 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 105 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 106 * the <code>JList</code>. 107 */ 108 public final JListItemFixture click(MouseClickInfo mouseClickInfo) { 109 list.clickItem(index, mouseClickInfo.button(), mouseClickInfo.times()); 110 return this; 111 } 112 113 /** 114 * Simulates a user double-clicking this fixture's list item. 115 * @return this fixture. 116 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 117 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 118 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 119 * the <code>JList</code>. 120 */ 121 public final JListItemFixture doubleClick() { 122 list.clickItem(index, LEFT_BUTTON, 2); 123 return this; 124 } 125 126 /** 127 * Simulates a user right-clicking this fixture's list item. 128 * @return this fixture. 129 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 130 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 131 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 132 * the <code>JList</code>. 133 */ 134 public final JListItemFixture rightClick() { 135 list.clickItem(index, RIGHT_BUTTON, 1); 136 return this; 137 } 138 139 /** 140 * Shows a pop-up menu using this fixture's list item as the invoker of the pop-up menu. 141 * @return a fixture that manages the displayed pop-up menu. 142 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 143 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 144 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 145 * the <code>JList</code>. 146 * @throws ComponentLookupException if a pop-up menu cannot be found. 147 */ 148 public final JPopupMenuFixture showPopupMenu() { 149 return list.showPopupMenuAt(index); 150 } 151 152 /** 153 * Returns the <code>String</code> representation of the value of this fixture's list item, using the 154 * <code>{@link JListCellReader}</code> from the <code>{@link JListFixture}</code> that created this 155 * <code>{@link JListItemFixture}</code>. 156 * @return the <code>String</code> representation of the value of this fixture's list item. 157 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 158 * the <code>JList</code>. 159 * @see JListFixture#cellReader(JListCellReader) 160 */ 161 public final String value() { 162 return list.valueAt(index); 163 } 164 165 /** 166 * Simulates a user dragging this fixture's list item. 167 * @return this fixture. 168 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 169 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 170 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 171 * the <code>JList</code>. 172 */ 173 public final JListItemFixture drag() { 174 list.drag(index); 175 return this; 176 } 177 178 /** 179 * Simulates a user dropping into this fixture's list item. 180 * @return this fixture. 181 * @throws IllegalStateException if this fixture's <code>JList</code> is disabled. 182 * @throws IllegalStateException if this fixture's <code>JList</code> is not showing on the screen. 183 * @throws IndexOutOfBoundsException if this item's index is negative or greater than the index of the last item in 184 * the <code>JList</code>. 185 * @throws ActionFailedException if there is no drag action in effect. 186 */ 187 public final JListItemFixture drop() { 188 list.drop(index); 189 return this; 190 } 191 192 /** 193 * Returns the index of this fixture's list item. 194 * @return the index of this fixture's list item. 195 */ 196 public final int index() { return index; } 197 }