/*
* JBoss, Home of Professional Open Source
* Copyright 2010-2016, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.tests.metamer.ftest.richInputNumberSpinner;
import static org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.ValuesFrom.FROM_FIELD;
import static org.richfaces.tests.metamer.ftest.richInputNumberSpinner.AbstractInputNumberSpinnerTest.DEFAULT_MAX_VALUE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import javax.faces.event.PhaseId;
import org.jboss.arquillian.graphene.Graphene;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.richfaces.fragment.common.ClearType;
import org.richfaces.fragment.common.Event;
import org.richfaces.fragment.common.TextInputComponentImpl;
import org.richfaces.tests.metamer.ftest.BasicAttributes;
import org.richfaces.tests.metamer.ftest.annotations.IssueTracking;
import org.richfaces.tests.metamer.ftest.extension.attributes.coverage.annotations.CoversAttributes;
import org.richfaces.tests.metamer.ftest.extension.configurator.templates.annotation.Templates;
import org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.UseWithField;
import org.richfaces.tests.metamer.ftest.webdriver.Attributes;
import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage.WaitRequestType;
import org.testng.annotations.Test;
/**
* Test case for page /faces/components/richInputNumberSpinner/simple.xhtml
*
* @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
* @author <a href="https://community.jboss.org/people/ppitonak">Pavol Pitonak</a>
*/
@IssueTracking("https://issues.jboss.org/browse/RF-12365")
public class TestInputNumberSpinnerAttributes extends AbstractInputNumberSpinnerTest {
@FindBy(css = "span.rf-insp-dec-dis")
private WebElement disabledDecreaseBtn;
@FindBy(css = "span.rf-insp-inc-dis")
private WebElement disabledIncreaseBtn;
private final Attributes<InputNumberSpinnerAttributes> inputNumberSpinnerAttributes = getAttributes();
@Override
public String getComponentTestPagePath() {
return "richInputNumberSpinner/simple.xhtml";
}
@Test
@CoversAttributes("accesskey")
@IssueTracking("https://issues.jboss.org/browse/RF-11315")
@Templates(value = "plain")
public void testAccesskey() {
testHTMLAttribute(spinner.advanced().getInput().advanced().getInputElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.accesskey, "x");
}
@Test
@IssueTracking("https://issues.jboss.org/browse/RF-11628")
public void testChangeValueByTypingThenByArrows() {
TextInputComponentImpl input = spinner.advanced().getInput();
assertEquals(getOutputText(), "2");// default value
// type valid value and increase
input.clear().sendKeys("9");
Graphene.guardAjax(spinner).increase();
assertEquals(getOutputText(), "10");
// type valid value and decrease
input.clear().sendKeys("-3");
Graphene.guardAjax(spinner).decrease();
Graphene.guardAjax(spinner).decrease();
assertEquals(getOutputText(), "-5");
// type invalid value and increase
input.clear().sendKeys("INVALID");
Graphene.guardAjax(spinner).increase();
assertEquals(getOutputText(), "-4");// value from previous step increased by one
// type invalid value and decrease
input.clear().sendKeys("INVALID");
Graphene.guardAjax(spinner).decrease();
assertEquals(getOutputText(), "-5");// value from previous step decreased by one
// type valid value, but greater than max value (10) and decrease
input.clear().sendKeys("40");
Graphene.guardAjax(spinner).decrease();
// decrease/increase with arrows will set the number to the max value
assertEquals(getOutputText(), "10");
}
@Test(groups = "smoke")
@CoversAttributes("cycled")
public void testCycled() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.cycled, Boolean.TRUE);
typeToInput(DEFAULT_MAX_VALUE);
// test that value change to min value (10 -> -10)
increase(1);
assertEquals(getOutputText(), DEFAULT_MIN_VALUE, "Output was not updated.");
assertEquals(getInputText(), DEFAULT_MIN_VALUE, "Input was not updated.");
// test that value change to max value (-10 -> 10)
decrease(1);
assertEquals(getOutputText(), DEFAULT_MAX_VALUE, "Output was not updated.");
assertEquals(getInputText(), DEFAULT_MAX_VALUE, "Input was not updated.");
}
@Test
public void testDecrease() {
super.testDecrease();
}
@Test
@CoversAttributes("dir")
@Templates(value = "plain")
public void testDir() {
testDir(spinner.advanced().getRootElement());
}
@Test
@CoversAttributes("disabled")
public void testDisabled() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.disabled, Boolean.TRUE);
String attribute = spinner.advanced().getInput().advanced().getInputElement().getAttribute("disabled");
assertTrue(attribute.equals("disabled") || attribute.equals("true"), "Input should be disabled");
assertNotPresent(spinner.advanced().getArrowDecreaseElement(), "Decrease button should not be present on page");
assertNotPresent(spinner.advanced().getArrowIncreaseElement(), "Increase button should not be present on page");
assertPresent(disabledDecreaseBtn, "Disabled decrease button should be present on page");
assertPresent(disabledIncreaseBtn, "Disabled increase button should be present on page");
}
@Test
@CoversAttributes("enableManualInput")
@Templates(value = "plain")
public void testEnableManualInput() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.enableManualInput, Boolean.FALSE);
String attribute = spinner.advanced().getInput().advanced().getInputElement().getAttribute("readonly");
assertTrue(attribute.equals("readonly") || attribute.equals("true"), "Input should be readonly");
assertPresent(spinner.advanced().getArrowDecreaseElement(), "Decrease button should be present on page");
assertPresent(spinner.advanced().getArrowIncreaseElement(), "Increase button should be present on page");
}
@Test
@CoversAttributes("immediate")
public void testImmediate() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.immediate, Boolean.TRUE);
String testedValue = "4";
String listenerMsg = "value changed: " + DEFAULT_VALUE + " -> " + testedValue;
typeToInput(testedValue);
getMetamerPage().assertPhases(PhaseId.ANY_PHASE);
getMetamerPage().assertListener(PhaseId.APPLY_REQUEST_VALUES, listenerMsg);
}
@Test(groups = "smoke")
public void testIncrease() {
super.testIncrease();
}
@Test
public void testInit() {
assertVisible(spinner.advanced().getRootElement(), "Spinner is not present on the page.");
assertVisible(spinner.advanced().getInput().advanced().getInputElement(), "Spinner's input is not visible.");
assertVisible(spinner.advanced().getArrowDecreaseElement(), "Spinner's decrease button is not visible.");
assertVisible(spinner.advanced().getArrowIncreaseElement(), "Spinner's increase button is not visible.");
}
@Test
@CoversAttributes("inputClass")
@Templates(value = "plain")
public void testInputClass() {
testStyleClass(spinner.advanced().getInput().advanced().getInputElement(), BasicAttributes.inputClass);
}
@Test
@CoversAttributes("inputSize")
@Templates(value = "plain")
public void testInputSize() {
String testedValue = "3";
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.inputSize, testedValue);
assertEquals(spinner.advanced().getInput().advanced().getInputElement().getAttribute("size"), testedValue,
"Input's size attribute.");
testedValue = "40";
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.inputSize, testedValue);
assertEquals(spinner.advanced().getInput().advanced().getInputElement().getAttribute("size"), testedValue,
"Input's size attribute.");
}
@Test
@CoversAttributes("lang")
@Templates(value = "plain")
public void testLang() {
testLang(spinner.advanced().getRootElement());
}
@Test
@CoversAttributes("maxValue")
public void testMaxValueClick() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.maxValue, 13);
increase(9);
assertEquals(getInputText(), "11", "Input was not updated.");// 2+9
assertEquals(getOutputText(), "11", "Output was not updated.");// 2+9
increase(2);
assertEquals(getInputText(), "13", "Input was not updated.");// 2+9+2
assertEquals(getOutputText(), "13", "Output was not updated.");// 2+9+2
increase(2);
assertEquals(getInputText(), "13", "Input was not updated.");// 2+9+2+2, but maximum is 13
assertEquals(getOutputText(), "13", "Output was not updated.");// 2+9+2+2, but maximum is 13
}
@Test
@CoversAttributes("maxValue")
public void testMaxValueType() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.maxValue, 13);
typeToInput("11");
assertEquals(getInputText(), "11", "Input was not updated.");
assertEquals(getOutputText(), "11", "Output was not updated.");
typeToInput("13");
assertEquals(getInputText(), "13", "Input was not updated.");
assertEquals(getOutputText(), "13", "Output was not updated.");
typeToInput("15", WaitRequestType.NONE);
assertEquals(getInputText(), "13", "Input should stay same as before.");// max is 13
assertEquals(getOutputText(), "13", "Output should stay same as before.");// max is 13
}
@Test(groups = "smoke")
@CoversAttributes("minValue")
public void testMinValueClick() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.minValue, -13);
decrease(9);
assertEquals(getInputText(), "-7", "Input was not updated.");// 2-9
assertEquals(getOutputText(), "-7", "Output was not updated.");// 2-9
decrease(6);
assertEquals(getInputText(), "-13", "Input was not updated.");// 2-9-6
assertEquals(getOutputText(), "-13", "Output was not updated.");// 2-9-6
decrease(2);
assertEquals(getInputText(), "-13", "Input was not updated.");// 2-9-6-2, but minimum is -13
assertEquals(getOutputText(), "-13", "Output was not updated.");// 2-9-6-2, but minimum is -13
}
@Test
@CoversAttributes("minValue")
public void testMinValueType() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.minValue, -13);
typeToInput("-11");
assertEquals(getInputText(), "-11", "Input was not updated.");
assertEquals(getOutputText(), "-11", "Output was not updated.");
typeToInput("-13");
assertEquals(getInputText(), "-13", "Input was not updated.");
assertEquals(getOutputText(), "-13", "Output was not updated.");
typeToInput("-15", WaitRequestType.NONE);
assertEquals(getInputText(), "-13", "Intput should stay same as before.");// min is -13
assertEquals(getOutputText(), "-13", "Output should stay same as before.");// min is -13
}
@Test
@CoversAttributes("onblur")
@Templates(value = "plain")
public void testOnblur() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onblur,
new Actions(driver).click(spinner.advanced().getInput().advanced().getInputElement()).click(getMetamerPage().getRequestTimeElement())
.build());
}
@Test
@CoversAttributes("onchange")
public void testOnchangeClick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onchange, new Action() {
@Override
public void perform() {
increase(1);
}
});
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onchange, new Action() {
@Override
public void perform() {
decrease(1);
}
});
}
@Test
@CoversAttributes("onchange")
public void testOnchangeType() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onchange, new Action() {
@Override
public void perform() {
typeToInput("10");
}
});
}
@Test
@CoversAttributes("onclick")
@Templates(value = "plain")
public void testOnclick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onclick,
new Actions(driver).click(spinner.advanced().getRootElement()).build());
}
@Test
@CoversAttributes("ondblclick")
@Templates(value = "plain")
public void testOndblclick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.ondblclick,
new Actions(driver).doubleClick(spinner.advanced().getRootElement()).build());
}
@Test
@CoversAttributes("ondownclick")
@IssueTracking("https://issues.jboss.org/browse/RF-10581")
@Templates(value = "plain")
public void testOndownclick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.ondownclick, new Action() {
@Override
public void perform() {
decrease(1);
}
});
}
@Test
@CoversAttributes("onfocus")
@Templates(value = "plain")
public void testOnfocus() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onfocus,
new Actions(driver).click(spinner.advanced().getInput().advanced().getInputElement()).build());
}
@Test
@CoversAttributes("oninputclick")
@Templates(value = "plain")
public void testOninputclick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.oninputclick,
new Actions(driver).click(spinner.advanced().getInput().advanced().getInputElement()).build());
}
@Test
@CoversAttributes("oninputdblclick")
@IssueTracking("https://issues.jboss.org/browse/RF-9568")
@Templates(value = "plain")
public void testOninputdblclick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.oninputdblclick, new Actions(driver)
.doubleClick(spinner.advanced().getInput().advanced().getInputElement()).build());
}
@Test
@CoversAttributes("oninputkeydown")
@Templates(value = "plain")
public void testOninputkeydown() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.KEYDOWN, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputkeydown);
}
@Test
@CoversAttributes("oninputkeypress")
@Templates(value = "plain")
public void testOninputkeypress() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.KEYPRESS, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputkeypress);
}
@Test
@CoversAttributes("oninputkeyup")
@Templates(value = "plain")
public void testOninputkeyup() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.KEYUP, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputkeyup);
}
@Test
@CoversAttributes("oninputmousedown")
@Templates(value = "plain")
public void testOninputmousedown() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.MOUSEDOWN, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputmousedown);
}
@Test
@CoversAttributes("oninputmousemove")
@Templates(value = "plain")
public void testOninputmousemove() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.MOUSEMOVE, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputmousemove);
}
@Test
@CoversAttributes("oninputmouseout")
@Templates(value = "plain")
public void testOninputmouseout() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.MOUSEOUT, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputmouseout);
}
@Test
@CoversAttributes("oninputmouseover")
@Templates(value = "plain")
public void testOninputmouseover() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.MOUSEOVER, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputmouseover);
}
@Test
@CoversAttributes("oninputmouseup")
@Templates(value = "plain")
public void testOninputmouseup() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), Event.MOUSEUP, inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.oninputmouseup);
}
@Test
@CoversAttributes("onkeydown")
@Templates(value = "plain")
public void testOnkeydown() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onkeydown);
}
@Test
@CoversAttributes("onkeypress")
@Templates(value = "plain")
public void testOnkeypress() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onkeypress);
}
@Test
@CoversAttributes("onkeyup")
@Templates(value = "plain")
public void testOnkeyup() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onkeyup);
}
@Test
@CoversAttributes("onmousedown")
@Templates(value = "plain")
public void testOnmousedown() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onmousedown);
}
@Test
@CoversAttributes("onmousemove")
@Templates(value = "plain")
public void testOnmousemove() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onmousemove);
}
@Test
@CoversAttributes("onmouseout")
@Templates(value = "plain")
public void testOnmouseout() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onmouseout);
}
@Test
@CoversAttributes("onmouseover")
@Templates(value = "plain")
public void testOnmouseover() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onmouseover);
}
@Test
@CoversAttributes("onmouseup")
@Templates(value = "plain")
public void testOnmouseup() {
testFireEventWithJS(spinner.advanced().getRootElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onmouseup);
}
@Test
@CoversAttributes("onselect")
@Templates(value = "plain")
public void testOnselect() {
testFireEventWithJS(spinner.advanced().getInput().advanced().getInputElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.onselect);
}
@Test
@CoversAttributes("onupclick")
@Templates(value = "plain")
public void testOnupclick() {
testFireEvent(inputNumberSpinnerAttributes, InputNumberSpinnerAttributes.onupclick, new Action() {
@Override
public void perform() {
increase(1);
}
});
}
@Test
@CoversAttributes("rendered")
@Templates(value = "plain")
public void testRendered() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.rendered, Boolean.FALSE);
assertNotPresent(spinner.advanced().getRootElement(), "Spinner should not be rendered when rendered=false.");
}
@Test
@CoversAttributes("step")
public void testStep() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.step, 5);
increase(1);
assertEquals(getOutputText(), "7", "Wrong output");
increase(1);
assertEquals(getOutputText(), "10", "Wrong output");
decrease(3);
assertEquals(getOutputText(), "-5", "Wrong output");
decrease(1);
assertEquals(getOutputText(), "-10", "Wrong output");
decrease(1);
assertEquals(getOutputText(), "-10", "Wrong output");
increase(1);
assertEquals(getOutputText(), "-5", "Wrong output");
}
@Test
@CoversAttributes("style")
@Templates(value = "plain")
public void testStyle() {
testStyle(spinner.advanced().getRootElement());
}
@Test
@CoversAttributes("styleClass")
@Templates(value = "plain")
public void testStyleClass() {
testStyleClass(spinner.advanced().getRootElement());
}
@Test
@CoversAttributes("style")
@IssueTracking("https://issues.jboss.org/browse/RF-10782")
@Templates(value = "plain")
public void testStyleWidth() {
setAttribute("style", "width: 700px");
assertEquals(spinner.advanced().getRootElement().getCssValue("width"), "700px");
}
@Test
@CoversAttributes("tabindex")
@IssueTracking("https://issues.jboss.org/browse/RF-10980")
@Templates(value = "plain")
public void testTabindex() {
testHTMLAttribute(spinner.advanced().getInput().advanced().getInputElement(), inputNumberSpinnerAttributes,
InputNumberSpinnerAttributes.tabindex, "57");
}
@Test
@CoversAttributes("title")
@Templates(value = "plain")
public void testTitle() {
testTitle(spinner.advanced().getRootElement());
}
@Test
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "bigNumbers")
public void testTypeIntoInputBig() {
super.testTypeIntoInputBig();
}
@Test
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "correctNumbers")
public void testTypeIntoInputCorrect() {
super.testTypeIntoInputCorrect();
}
@Test
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "decimalNumbers")
public void testTypeIntoInputDecimal() {
super.testTypeIntoInputDecimal();
}
@Test
public void testTypeIntoInputNotNumber() {
super.testTypeIntoInputNotNumber();
}
@Test
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "smallNumbers")
public void testTypeIntoInputSmall() {
super.testTypeIntoInputSmall();
}
@Test
@CoversAttributes("value")
@Templates("plain")
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "bigNumbers")
public void testValueBig() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.value, number);
assertEquals(getOutputText(), number, "Output was not updated.");
assertEquals(getInputText(), "10", "Input was not updated.");
}
@Test
@CoversAttributes("valueChangeListener")
public void testValueChangeListener() {
String testedValue = "4";
String listenerMsg = "value changed: " + DEFAULT_VALUE + " -> " + testedValue;
typeToInput(testedValue);
getMetamerPage().assertListener(PhaseId.PROCESS_VALIDATIONS, listenerMsg);
}
@Test
@CoversAttributes("value")
@Templates("plain")
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "correctNumbers")
public void testValueCorrect() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.value, number);
assertEquals(getOutputText(), number, "Output was not updated.");
}
@Test
@CoversAttributes("value")
@Templates("plain")
@UseWithField(field = "number", valuesFrom = FROM_FIELD, value = "smallNumbers")
public void testValueSmall() {
inputNumberSpinnerAttributes.set(InputNumberSpinnerAttributes.value, number);
assertEquals(getOutputText(), number, "Output was not updated.");
assertEquals(getInputText(), "-10", "Input was not updated.");
}
private void typeToInput(String value, WaitRequestType type) {
spinner.advanced().getInput().advanced().clear(ClearType.JS).sendKeys(value);
blur(type);
}
private void typeToInput(String value) {
typeToInput(value, WaitRequestType.XHR);
}
}