001 /* 002 * Created on Dec 1, 2009 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 005 * 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 is distributed on 010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 011 * specific language governing permissions and limitations under the License. 012 * 013 * Copyright @2009-2010 the original author or authors. 014 */ 015 package org.fest.swing.driver; 016 017 import static java.util.concurrent.TimeUnit.SECONDS; 018 import static org.fest.assertions.Assertions.assertThat; 019 import static org.fest.swing.driver.JProgressBarIndeterminateQuery.isIndeterminate; 020 import static org.fest.swing.driver.JProgressBarMinimumAndMaximumQuery.minimumAndMaximumOf; 021 import static org.fest.swing.driver.JProgressBarStringQuery.stringOf; 022 import static org.fest.swing.driver.JProgressBarValueQuery.valueOf; 023 import static org.fest.swing.driver.JProgressBarWaitUntilIsDeterminate.waitUntilValueIsDeterminate; 024 import static org.fest.swing.driver.JProgressBarWaitUntilValueIsEqualToExpectedTask.waitUntilValueIsEqualToExpected; 025 import static org.fest.swing.driver.TextAssert.verifyThat; 026 import static org.fest.swing.timing.Timeout.timeout; 027 import static org.fest.util.Strings.concat; 028 029 import java.util.regex.Pattern; 030 031 import javax.swing.JProgressBar; 032 033 import org.fest.swing.annotation.RunsInEDT; 034 import org.fest.swing.core.Robot; 035 import org.fest.swing.exception.WaitTimedOutError; 036 import org.fest.swing.timing.Timeout; 037 import org.fest.swing.util.Pair; 038 039 /** 040 * Understands functional testing of <code>{@link JProgressBar}</code>s: 041 * <ul> 042 * <li>state verification</li> 043 * <li>property value query</li> 044 * </ul> 045 * This class is intended for internal use only. Please use the classes in the package 046 * <code>{@link org.fest.swing.fixture}</code> in your tests. 047 * 048 * @author Alex Ruiz 049 * 050 * @since 1.2 051 */ 052 public class JProgressBarDriver extends JComponentDriver implements TextDisplayDriver<JProgressBar> { 053 054 private static final Timeout DEFAULT_TIMEOUT = timeout(30, SECONDS); 055 private static final String TEXT_PROPERTY = "string"; 056 057 /** 058 * Creates a new </code>{@link JProgressBarDriver}</code>. 059 * @param robot the robot to use to simulate user input. 060 */ 061 public JProgressBarDriver(Robot robot) { 062 super(robot); 063 } 064 065 /** 066 * Asserts that the text of the <code>{@link JProgressBar}</code> is equal to the specified <code>String</code>. 067 * @param progressBar the target <code>JProgressBar</code>. 068 * @param expected the text to match. 069 * @throws AssertionError if the text of the <code>JProgressBar</code> is not equal to the given one. 070 * @see JProgressBar#getString() 071 */ 072 @RunsInEDT 073 public void requireText(JProgressBar progressBar, String expected) { 074 verifyThat(stringOf(progressBar)).as(propertyName(progressBar, TEXT_PROPERTY)).isEqualOrMatches(expected); 075 } 076 077 /** 078 * Asserts that the text of the <code>{@link JProgressBar}</code> matches the given regular expression pattern. 079 * @param progressBar the target <code>JProgressBar</code>. 080 * @param pattern the regular expression pattern to match. 081 * @throws AssertionError if the text of the <code>JProgressBar</code> does not match the given regular expression pattern. 082 * @throws NullPointerException if the given regular expression pattern is <code>null</code>. 083 * @see JProgressBar#getString() 084 */ 085 @RunsInEDT 086 public void requireText(JProgressBar progressBar, Pattern pattern) { 087 verifyThat(stringOf(progressBar)).as(propertyName(progressBar, TEXT_PROPERTY)).matches(pattern); 088 } 089 090 /** 091 * Verifies that the value of the given <code>{@link JProgressBar}</code> is equal to the given one. 092 * @param progressBar the target <code>JProgressBar</code>. 093 * @param value the expected value. 094 * @throws AssertionError if the value of the <code>JProgressBar</code> is not equal to the given one. 095 */ 096 @RunsInEDT 097 public void requireValue(JProgressBar progressBar, int value) { 098 assertThat(valueOf(progressBar)).as(propertyName(progressBar, "value")).isEqualTo(value); 099 } 100 101 /** 102 * Verifies that the given <code>{@link JProgressBar}</code> is in indeterminate mode. 103 * @param progressBar the target <code>JProgressBar</code>. 104 * @throws AssertionError if the given <code>JProgressBar</code> is not in indeterminate mode. 105 */ 106 @RunsInEDT 107 public void requireIndeterminate(JProgressBar progressBar) { 108 requireIndeterminate(progressBar, true); 109 } 110 111 /** 112 * Verifies that the given <code>{@link JProgressBar}</code> is in determinate mode. 113 * @param progressBar the target <code>JProgressBar</code>. 114 * @throws AssertionError if the given <code>JProgressBar</code> is not in determinate mode. 115 */ 116 @RunsInEDT 117 public void requireDeterminate(JProgressBar progressBar) { 118 requireIndeterminate(progressBar, false); 119 } 120 121 @RunsInEDT 122 private void requireIndeterminate(JProgressBar progressBar, boolean indeterminate) { 123 assertThat(isIndeterminate(progressBar)).as(propertyName(progressBar, "indeterminate")).isEqualTo(indeterminate); 124 } 125 126 /** 127 * Waits until the value of the given <code>{@link JProgressBar}</code> is equal to the given value. 128 * @param progressBar the target <code>JProgressBar</code>. 129 * @param value the expected value. 130 * @throws IllegalArgumentException if the given value is less than the <code>JProgressBar</code>'s minimum value. 131 * @throws IllegalArgumentException if the given value is greater than the <code>JProgressBar</code>'s maximum value. 132 * @throws WaitTimedOutError if the value of the <code>JProgressBar</code> does not reach the expected value within 133 * 30 seconds. 134 */ 135 @RunsInEDT 136 public void waitUntilValueIs(JProgressBar progressBar, int value) { 137 waitUntilValueIs(progressBar, value, DEFAULT_TIMEOUT); 138 } 139 140 /** 141 * Waits until the value of the given <code>{@link JProgressBar}</code> is equal to the given value. 142 * @param progressBar the target <code>JProgressBar</code>. 143 * @param value the expected value. 144 * @param timeout the amount of time to wait. 145 * @throws IllegalArgumentException if the given value is less than the <code>JProgressBar</code>'s minimum value. 146 * @throws IllegalArgumentException if the given value is greater than the <code>JProgressBar</code>'s maximum value. 147 * @throws NullPointerException if the given timeout is <code>null</code>. 148 * @throws WaitTimedOutError if the value of the <code>JProgressBar</code> does not reach the expected value within 149 * the specified timeout. 150 */ 151 @RunsInEDT 152 public void waitUntilValueIs(JProgressBar progressBar, int value, Timeout timeout) { 153 assertIsInBetweenMinAndMax(progressBar, value); 154 validateIsNotNull(timeout); 155 waitUntilValueIsEqualToExpected(progressBar, value, timeout); 156 } 157 158 @RunsInEDT 159 private void assertIsInBetweenMinAndMax(JProgressBar progressBar, int value) { 160 Pair<Integer, Integer> minAndMax = minimumAndMaximumOf(progressBar); 161 assertIsInBetweenMinAndMax(value, minAndMax.i, minAndMax.ii); 162 } 163 164 private void assertIsInBetweenMinAndMax(int value, int min, int max) { 165 if (value >= min && value <= max) return; 166 throw new IllegalArgumentException(concat("Value <", value, "> should be between <[", min, ", ", max, "]>")); 167 } 168 169 /** 170 * Waits until the value of the given <code>{@link JProgressBar}</code> is in determinate mode. 171 * @param progressBar the target <code>JProgressBar</code>. 172 * @throws WaitTimedOutError if the <code>JProgressBar</code> does not reach determinate mode within 30 seconds. 173 */ 174 @RunsInEDT 175 public void waitUntilIsDeterminate(JProgressBar progressBar) { 176 waitUntilIsDeterminate(progressBar, DEFAULT_TIMEOUT); 177 } 178 179 /** 180 * Waits until the value of the given <code>{@link JProgressBar}</code> is in determinate mode. 181 * @param progressBar the target <code>JProgressBar</code>. 182 * @param timeout the amount of time to wait. 183 * @throws NullPointerException if the given timeout is <code>null</code>. 184 * @throws WaitTimedOutError if the <code>JProgressBar</code> does not reach determinate mode within the specified 185 * timeout. 186 */ 187 @RunsInEDT 188 public void waitUntilIsDeterminate(JProgressBar progressBar, Timeout timeout) { 189 validateIsNotNull(timeout); 190 waitUntilValueIsDeterminate(progressBar, timeout); 191 } 192 193 private void validateIsNotNull(Timeout timeout) { 194 if (timeout == null) throw new NullPointerException("Timeout should not be null"); 195 } 196 197 /** 198 * Returns the text of the given <code>{@link JProgressBar}</code>. 199 * @param progressBar the target <code>JProgressBar</code>. 200 * @return the text of the given <code>{@link JProgressBar}</code>. 201 */ 202 @RunsInEDT 203 public String textOf(JProgressBar progressBar) { 204 return stringOf(progressBar); 205 } 206 }