// Copyright � 2002-2005 Canoo Engineering AG, Switzerland.
package com.canoo.webtest.steps.verify;
import com.canoo.webtest.engine.StepFailedException;
import com.canoo.webtest.util.ConversionUtil;
import com.canoo.webtest.util.FormUtil;
import com.canoo.webtest.util.HtmlConstants;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlOption;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
/**
* Verifies that a select form field meets particular criteria
*
* @author unknown
* @author Marc Guillemot
* @author Paul King
* @webtest.step
* category="Core"
* name="verifySelectField"
* alias="verifyselectfield"
* description="This step verifies whether a particular SELECT - Option Selector exists and is marked as selected. The option selector may be chosen by either its <em>value</em> attribute or the <em>text</em> associated with the selector."
*/
public class VerifySelectField extends AbstractVerifyFormStep {
private static final Logger LOG = Logger.getLogger(VerifySelectField.class);
private String fText;
private String fRegex;
public String getText() {
return fText;
}
/**
* @param text
* @webtest.parameter
* required="yes/no"
* description="The option text. Specification of either <em>text</em> or <em>value</em> is mandatory."
*/
public void setText(final String text) {
fText = text;
}
public String getRegex() {
return fRegex;
}
/**
* @param regex
* @webtest.parameter
* required="no"
* default="'false'"
* description="Specifies whether the text or value represents a <key>regex</key>."
*/
public void setRegex(final String regex) {
fRegex = regex;
}
/**
* Finds the relevant form.
*
*/
protected HtmlForm findForm() {
return FormUtil.findFormForField(getContext(), getFormName(), HtmlConstants.SELECT, null, getName(), this);
}
protected List findFields(final HtmlForm form) {
return form.getSelectsByName(getName());
}
protected void verifyField(final HtmlElement field) throws IOException {
final HtmlSelect curSelect = (HtmlSelect) field;
for (final Iterator iter = curSelect.getOptions().iterator(); iter.hasNext();) {
final HtmlOption curOption = (HtmlOption) iter.next();
if ((getText() == null || verifyStrings(getText(), curOption.asText()))
&& (getValue() == null || verifyStrings(getValue(), curOption.getValueAttribute()))) {
LOG.debug("Found corresponding option " + curOption);
if (curOption.isSelected()) {
return;
}
throw new StepFailedException(getStepLabel() + ": " + buildFailMessage(getValue()), this);
}
}
// if we reach here, we haven't found anything
throw new StepFailedException("Select option \"" + fText + " : " + getValue()
+ "\" not found for inputfield: <" + getName() + ">",
this);
}
private boolean verifyStrings(final String expectedValue, final String actualValue) {
return getVerifier(ConversionUtil.convertToBoolean(getRegex(), false)).verifyStrings(expectedValue, actualValue);
}
private String buildFailMessage(final String value) {
final StringBuffer sb = new StringBuffer();
sb.append("Select option <");
sb.append("value:").append(value);
sb.append(" / text:").append(getText());
sb.append("> is not selected!");
return sb.toString();
}
protected void verifyParameters() {
super.verifyParameters();
paramCheck(isValueNull() && getText() == null, "Required parameter \"text\" or \"value\" not set!");
}
}